用于模式搜索的 Rabin-Karp 算法的PHP程序
给定一个文本TXT [0..N-1]和模式拍[0..M-1],写一个函数搜索(炭轻拍[],炭TXT []),该打印所有在TXT轻拍的[]出现[] .您可以假设 n > m。
例子:
输入:txt[] = "THIS IS A TEST TEXT" pat[] = "TEST" 输出:在索引 10 处找到模式输入:txt[] = "AABAACAADAABAABA" pat[] = "AABA" 输出:在索引 0 处找到模式在索引 9 处找到的模式 在索引 12 处找到的模式
Naive String Matching 算法将模式一一滑动。各滑动之后,在当前的换档,并且如果所有字符它逐一检查字符匹配,则打印该匹配。
与朴素算法一样,Rabin-Karp 算法也将模式一一滑动。但与 Naive 算法不同的是,Rabin Karp 算法将模式的哈希值与当前文本子串的哈希值进行匹配,如果哈希值匹配,则仅开始匹配单个字符。因此 Rabin Karp 算法需要计算以下字符串的哈希值。
1)模式本身。
2) 长度为 m 的文本的所有子串。
PHP
pattern
txt -> text
q -> A prime number
*/
function search($pat, $txt, $q)
{
$M = strlen($pat);
$N = strlen($txt);
$i; $j;
$p = 0; // hash value
// for pattern
$t = 0; // hash value
// for txt
$h = 1;
$d =1;
// The value of h would
// be "pow(d, M-1)%q"
for ($i = 0; $i < $M - 1; $i++)
$h = ($h * $d) % $q;
// Calculate the hash value
// of pattern and first
// window of text
for ($i = 0; $i < $M; $i++)
{
$p = ($d * $p + $pat[$i]) % $q;
$t = ($d * $t + $txt[$i]) % $q;
}
// Slide the pattern over
// text one by one
for ($i = 0; $i <= $N - $M; $i++)
{
// Check the hash values of
// current window of text
// and pattern. If the hash
// values match then only
// check for characters on
// by one
if ($p == $t)
{
// Check for characters
// one by one
for ($j = 0; $j < $M; $j++)
{
if ($txt[$i + $j] != $pat[$j])
break;
}
// if p == t and pat[0...M-1] =
// txt[i, i+1, ...i+M-1]
if ($j == $M)
echo "Pattern found at index ",
$i, "\n";
}
// Calculate hash value for
// next window of text:
// Remove leading digit,
// add trailing digit
if ($i < $N - $M)
{
$t = ($d * ($t - $txt[$i] *
$h) + $txt[$i +
$M]) % $q;
// We might get negative
// value of t, converting
// it to positive
if ($t < 0)
$t = ($t + $q);
}
}
}
// Driver Code
$txt = "GEEKS FOR GEEKS";
$pat = "GEEK";
$q = 101; // A prime number
search($pat, $txt, $q);
// This code is contributed
// by ajit
?>
输出:
Pattern found at index 0
Pattern found at index 10
有关更多详细信息,请参阅关于模式搜索的 Rabin-Karp 算法的完整文章!