Есть выражение и еще база выражений, нужно из базы выбрать похожие.
Напоминает поиск регэкспа (regular expression), но не в тексте как обычно, а в базе регэкспов.
В начале было слово. Длиной 10-1000 букв. Потом слов стало много, 10-100 слов. Их проанализировали, выделили в них общее и описали всю группу одним выражением. Потом выражений тоже стало много, 1000000. Возник вопрос как искать новое выражение в этой базе.
Набор строк собирается в одно выражение с помощью скобок и операторов *?&|,
например выражение А,((Б&В)|(?Г,Д)) это образ для набора строк АГД, АД, АБВ, АВБ,
*n означает любые символы длиной до n
? перед символом означает что он может быть или не быть
, означает что разделяемые им символы идут в указанном порядке и оба нужны, задает порядок следования
| означает либо то что слева либо то-что-справа, задает множество вариантов
& означает оба символа в любом порядке, прямом или обратном, задает множество всех перестановок
Символы имеют коэффициент вроде ценности, нужно в первую очередь искать соответствия по символам с наибольшей ценностью, а результаты упорядочить по сумме ценности совпавших элементов.
И искомый образ и база строятся по этим правилам, при нахождении соответствия нужно указать какая именно строка букв оказалась унифицирующей для искомого образа и выбранного из базы.
Наиболее ценный образ должен выдаваться как можно быстрее, за ним все остальные.