У меня есть два алгоритмических вопроса для проекта, над которым я работаю. Я думал об этом и имел некоторые подозрения, но я тоже хотел бы услышать вклад сообщества.Алгоритм для соответствия списку регулярных выражений
Пусть У меня есть строка, и список N регулярных выражений (на самом деле они являются подстановочные шаблоны, представляющие собой подмножество полной функциональности регулярных выражений). Я хочу знать, соответствует ли строка хотя бы одному из регулярных выражений в списке. Есть ли структура данных, которая может позволить мне сопоставить строку со списком регулярных выражений в сублинейном (предположительно логарифмическом) времени?
Это расширение предыдущей проблемы. Предположим, что у меня такая же ситуация: строка и список из N регулярных выражений, только теперь каждое из регулярных выражений сопряжено со смещением внутри строки, в которой должно начинаться совпадение (или, если хотите, каждое регулярное выражение должен соответствовать подстроке заданной строки, начинающейся с заданного смещения).
Для примера предположит, что у меня был строка:
This is a test string
и регулярные выражения модель и смещение:
(a) his.* at offset 0 (b) his.* at offset 1
Алгоритм должны вернуть истинные. Хотя regex (a) не соответствует строке, начинающейся со смещения 0, regex (b) действительно соответствует подстроке, начинающейся со смещения 1 («его тестовая строка»).
Есть ли структура данных, которая может позволить мне решить эту проблему в сублинейное время?
Одним из полезных сведений является то, что часто многие смещения в списке регулярных выражений являются одинаковыми (например, мы часто используем подстроку со смещением X много раз). Это может быть полезно для решения проблемы проблемы № 1 выше.
Благодарим вас за любые предложения, которые могут возникнуть у вас!
Какое подмножество регулярных выражений? Это всего лишь префиксный матч? В этом случае вы можете использовать дерево суффиксов. Однако сублинейный может быть слишком большим, чтобы просить об этом. Кроме того, какие изменения? Строка, подлежащая согласованию, или регулярные выражения? Или оба? – 2010-06-05 19:33:32
Посмотрите похожие вопросы: http://stackoverflow.com/questions/2899800 –
Спасибо за ваши ответы. Это не просто префиксное совпадение. Это прежде всего простые подстановочные знаки и классы символов, но они могут появляться где угодно (а не только префикс или суффикс). Регулярные выражения фиксируются при инициализации (во время выполнения), а строка, подлежащая согласованию, неоднократно изменяется в течение всей операции программы (программа получает новые строки для повторного сопоставления). – DSII