Если вы ищете подстроки, то Trie или Patrica trie могут быть хорошей отправной точкой.
Если вам не важен порядок, просто номер каждого символа или буквы, я бы вычислил гистограмму всех строк, а затем сравнил их с гистограммой ввода.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Hello World => ...11..1...3..2..1....1...
Это снизит затраты до O(26 * m + n)
плюс однократная предварительная обработка, если вы учитываете только латинские буквы без учета регистра.
Если m постоянно, вы можете интерпретировать гистограмму как 26-мерный вектор на 26-мерной единичной сфере, нормализуя ее. Тогда вы можете просто вычислить Dot Product двух векторов, дающих косинус угла между двумя векторами, и это значение должно быть пропорционально сходству строк.
Предполагая m = 3
, алфавит A = { 'U', 'V', 'W' }
только размера три, и следующий список строк.
L = { "UUU", "UVW", "WUU" }
Гистограммы следующие.
H = { (3, 0, 0), (1, 1, 1), (2, 0, 1) }
Гистограмма h = (x, y, z)
нормализуется до h' = (x/r, y/r, z/r)
с r
евклидовой нормой гистограммы h
- то есть r = sqrt(x² + y² + z²)
.
H' = { (1.000, 0.000, 0.000), (0.577, 0.577, 0.577), (0.894, 0.000, 0.447) }
Вход S = "VVW"
имеет гистограмму hs = (0, 2, 1)
и нормализованную гистограмму hs' = (0.000, 0.894, 0.447)
.
Теперь мы можем вычислить сходство двух гистограмм h1 = (a, b, c)
и h2 = (x, y, z)
как евклидово расстояние обеих гистограмм.
d(h1, h2) = sqrt((a - x)² + (b - y)² + (c - z)²)
Для примера получаем.
d((3, 0, 0), (0, 2, 1)) = 3.742
d((1, 1, 1), (0, 2, 1)) = 1.414
d((2, 0, 1), (0, 2, 1)) = 2.828
Следовательно, «UVW» наиболее близок к «VVW» (меньшие числа указывают на более высокое сходство).
Используя нормализованные гистограммы h1' = (a', b', c')
и h2' = (x', y', z')
, мы можем рассчитать расстояние как точечное произведение обеих гистограмм.
d'(h1', h2') = a'x' + b'y' + c'z'
Для примера получаем.
d'((1.000, 0.000, 0.000), (0.000, 0.894, 0.447)) = 0.000
d'((0.577, 0.577, 0.577), (0.000, 0.894, 0.447)) = 0.774
d'((0.894, 0.000, 0.447), (0.000, 0.894, 0.447)) = 0.200
Опять же, «UVW» определяется как наиболее близкий к «VVW» (большие цифры указывают на более высокое сходство).
Обе версии дают разные числа, но результаты всегда одинаковы. Можно также использовать другие нормы - например, расстояние Манхэттена (норма L1) - но это изменит только числа, потому что все нормы в конечномерных векторных пространствах эквивалентны.