に一致する私のコードの大きな-O、素朴なパターンを推定し、素朴なパターン検索は、私は、文字列アルゴリズムについてですCLRSブックから運動32.1から2を解決しようとしています
パターンP内のそのすべての文字とし異なっています。 NAIVE-STRING-MATCHERをn文字のテキストで時間O(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」に設定されているすべての文字を含むテキストを想像し、私は(第2ループにOで、毎回のダイビングますk * n)。
アルゴリズムのbig-Oとは何ですか? と私はより効率的なソリューションを得ることができますか?
私が知っているように、私が知っているように、上の境界を示すために堅い上限&Oを表すためにΘを使用しています。私の解答は、運動がΘでないと尋ねられた場合には最適であろうか? –
O(m + n) –
OとTheraを入れ替えて使うことができる人たち(difftentですが)は、私が質問をよく理解していないと思います。私のステートメントはシータ記号表記でも保持されます。 – usamec