📜  用于模式搜索的 Rabin-Karp 算法的PHP程序

📅  最后修改于: 2022-05-13 01:54:11.640000             🧑  作者: Mango

用于模式搜索的 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 算法的完整文章!