Блог пользователя Derbent

Автор Derbent, история, 8 лет назад, По-русски

В разборе этой задачи говорится о стандартном приёме превращения статической структуры данных в динамическую. Не понимаю о каком методе идёт речь и как применить его к Ахо-Корасику. Гугл не дал ответа.

  • Проголосовать: нравится
  • +25
  • Проголосовать: не нравится

»
8 лет назад, # |
Rev. 2   Проголосовать: нравится +37 Проголосовать: не нравится

Так в разборе же всё написано. Попробую обяснить немного подробнее. В каждый момент времени у тебя есть logN объектов структур, каждый из которых имеет размер порядка 2L, где L — порядковый номер структуры. Когда к нам пуступает запрос get — мы его перенаправляем во все экземпляры структур. Когда же запрос вида add — добавляем в структуру с номером 0. Размер структуры сразу станет  ≥ 20 — мы её очищаем, а перед этим объединяем её со структурой с номером 1. Если структура с номером 1 достигла размера 21 — проделываем ту же процедуру, пока не получим валидные размеры структур (sizeof(structi) < 2i). Чем больше структура — тем реже мы будем её обновлять.
(Из разбора) Легко видеть, что каждая строка перебросится не более logm раз и на каждый запрос мы умеем отвечать за O(logm).

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    В разборе было не очень понятно написано, после подробностей всё разъяснилось, спасибо. Если на то пошло, то не могли бы вы ответить на ещё один мой вопрос на счёт Ахо-Корасика? Если не нужно находить все вхождения, а только их количество, разве обязательно идти по сжатым суффиксным ссылкам и проверять кол-во переходов? Не легче завести переменную в каждой вершине, где будет написано кол-во терминальных вершин на пути к корню, если проходить по суффиксным ссылкам? Если можно, есть какие-нибудь подводные камни?

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А о каких сжатых ссылках и количестве переходов вообще идёт речь?

      • »
        »
        »
        »
        8 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Речь о сжатых суффиксных ссылках (ближайшая терминальная вершина, достижимая из суффиксных ссылок) и количестве терминальных вершин при переходе по сжатым суффиксным ссылкам до корня

        • »
          »
          »
          »
          »
          8 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Ну, конечно, нужно ввести такую переменную, а не ходить до корня каждый раз.

»
8 лет назад, # |
  Проголосовать: нравится +23 Проголосовать: не нравится

Об этом явно говорится в следующем абзаце там же. Попробую описать общую идею более подробно.

Пусть у нас есть некая структура, которую можно построить на N объектах за O(N) и потом с её помощью отвечать на запросы, но добавление эта структура не поддерживает. Для того, чтобы поддерживать добавление, будем хранить не одну копию структуры, а несколько, размером в различные степени двойки. Например, если N=10, у нас будут структуры размером 2 и 8.

Теперь добавление одного элемента похоже на прибавление единицы в двоичной системе счисления. Добавим в наше множество структуру размера 1, содержащую новый элемент; если в результате этого появилось две структуры размера 1, построим (за сумму размеров) структуру размера 2; если их теперь тоже две, повторим, пока требуется.

Можно показать, что это даст не более логарифма оверхеда: каждый элемент будет участвовать в построении на не более чем log n уровнях.