Задать вопрос

Алгоритм для быстрой проверки соответствия строки шаблонам?

В упрощенном виде задача такова: есть большое количество шаблонов из нулей и единиц. Возможен символ * в конце шаблона. ( Например: 1, 10, 1011* )
И есть большое количество строк. Для каждой строки необходимо проверить, "покрывается" ли строка каким-либо из шаблонов.

Вопрос: как это сделать наиболее эффективно? Наверняка есть какой-то известный алгоритм или структура данных для этой задачи.

------------------------------
UPD: Попробовал реализовать дерево префиксов. Вроде, работает правильно, но, к сожалению слишком медленно. Буду благодарен, если кто-нибудь сможет взглянуть на код -- может быть, я что-то написал неверно/неэффективно: pastebin.com/DKZzhvXA
  • Вопрос задан
  • 856 просмотров
Подписаться 3 Оценить Комментировать
Решение пользователя SeptiM К ответам на вопрос (4)
@SeptiM
Простое решение можно реализовать через префиксное дерево. Запихиваем все шаблоны, а потом сравниваем по строчке из множества.

Если требуется сделать разово и на большом объеме данных, я бы поступил так. Определим на строках обычный лексикографический порядок (если есть строка и её префикс, то префикс меньше). Каждому шаблону со звездочкой {s}* сопоставим две строки {s} и {s}$, где $ больше 0 и 1. Шаблону без звезды, просто ставим {s} и {s}&, где & < 0 и 1. А теперь, начиная с первого символа, запускаем цифровую сортировку на строках, полученных из шаблона, + проверяемых строках.

В полученной последовательности шаблоны образуют скобочную последовательность. Все, что находится внутри скобок матчится с соответствующим шаблоном.

Из положительного, это сделать проще, когда строки не влезают в память. Число разрядов на сравнение можно ограничить длиной самого длинного шаблона.
Ответ написан