У меня есть два алгоритмических вопроса для проекта, над которым я работаю. Я думал об этом, и у меня есть некоторые подозрения, но я хотел бы также услышать мнение сообщества.
Предположим, у меня есть строка и список из N регулярных выражений (на самом деле это шаблоны с подстановочными знаками, представляющие подмножество полной функциональности регулярных выражений). Я хочу знать, соответствует ли строка хотя бы одному из регулярных выражений в списке. Существует ли структура данных, которая может позволить мне сопоставить строку со списком регулярных выражений за сублинейное (предположительно, логарифмическое) время?
Это расширение предыдущей проблемы. Предположим, у меня та же ситуация: строка и список из N регулярных выражений, только теперь каждое из регулярных выражений связано со смещением в строке, с которой должно начинаться совпадение (или, если хотите, каждое из регулярных выражений должен соответствовать подстроке данной строки, начинающейся с заданного смещения).
Для примера предположим, что у меня есть строка:
This is a test string
и регулярные выражения и смещения:
(a) his.* at offset 0
(b) his.* at offset 1
Алгоритм должен возвращать true. Хотя регулярное выражение (a) не соответствует строке, начинающейся со смещения 0, регулярное выражение (b) соответствует подстроке, начинающейся со смещения 1 («его - тестовая строка»).
Существует ли структура данных, которая может позволить мне решить эту проблему в сублинейное время?
Одна, возможно, полезная часть информации - это то, что часто многие смещения в списке регулярных выражений одинаковы (то есть часто мы сопоставляем подстроку со смещением X много раз). Это может быть полезно для использования решения проблемы № 1 выше.
Большое спасибо заранее за любые ваши предложения!