Есть ли эффективная реализация словаря у которого ключ регулярное выражение?

Есть ли структура данных, по типу словаря, где ключи - регулярные выражения и поиск быстрее, чем линейный проход по всем регуляркам?
Ну или не регулярное выражение, а нечто похожее на "ILIKE %some_string%" - регистронезависимый поиск по подстроке.
  • Вопрос задан
  • 333 просмотра
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D...

Ну и да, быстрее O(N) вы не сделаете. Да и за O(N) этого не добиться... вам же еще подстроку искать.
Ответ написан
Комментировать
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии
я конечно новичок, но можно попробовать написать класс-конвертер с регулярки в строку и использовать его как ключ в какомнибудь контейнере stl
Ответ написан
Комментировать
lam0x86
@lam0x86
Регулярное выражение - это частный случай конечного автомата. Перед вами по сути стоит задача объединения всех выражений в один автомат, где начальным будет epsilon-состояние, т.е. в недетерминированный конечный автомат. Из него потом надо построить детерминированный КА с терминальными состояниями с соответствующими значениями из словоря. В общем, довольно непростое решение, но будет быстрее линейного перебора.
Как вариант, можно объединить все ключи словаря в одно регулярное выражение по принципу "(a1)|(a2)|...|(aN)", и затем определить, какая из групп окажется не пустой после матчинга. Это, по сути, то же самое, что я написал вначале, только гораздо проще.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы