Я пытаюсь решить упражнение 32.1-2 из книги CLRS, посвященное строковым алгоритмам, наивному поиску по шаблону.
Предположим, что все символы в шаблоне P различны. Покажите, как ускорить NAIVE-STRING-MATCHER, чтобы он выполнялся за время O(n) для текста из n символов.
Итак, я пытаюсь оптимизировать наивное решение грубой силы, которое я придумал, но я не думаю, что смогу сделать что-то лучше, чтобы сократить общее время работы до O (n).
<?php
//naive search
$a = array('a', 'b', 'u', 'c');
$b = array('a','b','u','c','a','b','u','c','b','a','b','u','c','b', 'a', 'b','c');
//index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
$n = count($b);
$k = count($a);
$counter = 0;
for($i=0;$i<$n - $k ;$i++){ // big- O (n)
//since its "exact string matching problem" i am testing here so i don't dive into second loop unless the ith character of B is matching the first char of the pattern
if($b[$i] == $a[0]){
for($j=$i; $j<$k; $j++){ // big O(k)
if($b[$j] == $a[$j])
$bool = true;
else {
$bool = false;
break;
}
}
if($bool){
echo "Found at index: ".$i."<br>";
$counter++;
}
// since pattern match cant overlap with another one, so when one is found jump by K iteration, here is all what I could do about the pattern's value being distinct, is there any possible optimization I can do
$i = $i + $k - 1;
}
}
echo $counter;
?>
Я, конечно, сократил время выполнения для этого конкретного экземпляра, но представьте себе в худшем случае текст со всеми его символами, установленными на «a», я буду погружаться во второй цикл каждый раз, когда это O (k * n).
Что такое большое O алгоритма? и могу ли я получить более эффективное решение?