Я играю с алгоритмом KMP в f sharp. Хотя он работает для таких шаблонов, как «ATAT» (результат будет [| 0; 0; 1; 2; |]), первый цикл while входит в тупик, когда первые 2 символа строки являются одинаковыми, а третий - другой , например, «AAT».F sharp KMP Алгоритм застревает в первом цикле while, если я использую шаблон с теми же символами в первых двух указателях
Я понимаю, почему: во-первых, я получаю приращение до 1. теперь первое условие для цикла while истинно, а второе также верно, потому что «A» <> «T». Теперь он устанавливает i в prefixtable. [! I], который снова является 1, и здесь мы идем.
Можете ли вы, ребята, дать мне подсказку, как это решить?
let kMPrefix (pattern : string) =
let (m : int) = pattern.Length - 1
let prefixTable = Array.create pattern.Length 0
// i : longest proper prefix that is also a suffix
let i = ref 0
// j: the index of the pattern for which the prefix value will be calculated
// starts with 1 because the first prefix value is always 0
for j in 1 .. m do
while !i > 0 && pattern.[!i] <> pattern.[j] do
i := prefixTable.[!i]
if pattern.[!i] = pattern.[j] then
i := !i+1
Array.set prefixTable j !i
prefixTable
Я раньше не использовал алгоритм Кнута-Морриса-Прата, но https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm предлагает, чтобы значение в первый индекс должен быть -1, а не 0, потому что несоответствие в самом начале строки является особым случаем. Это поможет решить вашу проблему? – rmunn