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

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

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

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

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

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

Из положительного, это сделать проще, когда строки не влезают в память. Число разрядов на сравнение можно ограничить длиной самого длинного шаблона.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Можно из шаблонов построить дерево или конечный автомат, каждую из строк достаточно будет прогнать один раз. Конечный автомат немного сложнее, зато его можно привести в минимальную форму, что ускорит сравнение.
Ответ написан
Комментировать
begemot_sun
@begemot_sun
Программист в душе.
Вам нужно построить конечный автомат на вход которого будет подаваться поток символов, а на выходе которого будут признаки шаблона.
Одним словом вам нужно построить компилятор для компиляции шаблонов в конечный автомат.
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
Aho–Corasick, trie?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы