C++ 程序实现滚动哈希

c++server side programmingprogramming

滚动哈希是一种哈希函数,其中输入在通过输入移动的窗口中进行哈希处理。

Rabin-Karp 是滚动哈希的流行应用。Rabin 和 Karp 提出的滚动哈希函数计算一个整数值。对于字符串,整数值是字符串的数值。

Rabin–Karp 字符串搜索算法通常使用一个非常简单的滚动哈希函数来解释,该函数仅使用乘法和加法 −

H=c1ak-1+c2ak-2+….+ cka0

其中,a为常数,c1、c2….ck为输入字符。为了操作H的Huge值,需要对n进行mod。

算法

开始
   声明一个整型常量变量P_B。
      初始化P_B= 227。
   声明一个整型常量变量P_M。
      初始化P_M= 1000005。
   声明一个hash()函数
     传递字符串 s 作为参数。
      声明整数数据类型的 r。
         初始化 r = 0。
      for (int i = 0; i < s.size(); i++)
         r = r* P_B + s[i]
         r %= P_M
      return r
    声明函数 rabin_karp(const string& n, const string& hstack)
      声明整数数据类型的 h1。
         初始化 h1 = hash(n)。
      声明整数数据类型的 h2。
         初始化 h2 = 0。
      声明整数数据类型的 power。
         初始化 power = 1。
      for (int i = 0; i < n.size(); i++)
         power = (power * P_B) % P_M
      for (int i = 0; i < hstack.size(); i++)
         h2 = h2*P_B + hstack[i]
         h2 %= P_M
         如果 (i >= n.size())
            h2 -= power * hstack[i-n.size()] % P_M
              if (h2 < 0)
               h2 += P_M
         if (i >= n.size()-1 && h1 == h2)
            return i - (n.size()-1);
      return -1;
   将 s1 和 s2 声明为字符串类型。
   打印"输入字符串:"
   调用 getline(line, s1) 输入字符串。
   打印"输入要查找的字符串:"
   输入 s2。
   if(rabin_karp(s2, s1) == -1)
      打印"未找到字符串"
   else
      打印字符串。
结束。

示例代码

#include <iostream>
#include <string>
using namespace std;
const int P_B= 227;
const int P_M = 1000005;
int hash(const string& s) {
   int r = 0;
   for (int i = 0; i < s.size(); i++) {
      r = r* P_B + s[i];
      r %= P_M;
   }
   return r;
}
int rabin_karp(const string& n, const string& hstack) {
   int h1 = hash(n);
   int h2 = 0;
   int power = 1;
   for (int i = 0; i < n.size(); i++)
      power = (power * P_B) % P_M;
   for (int i = 0; i < hstack.size(); i++) {
      h2 = h2*P_B + hstack[i];
      h2 %= P_M;
      if (i >= n.size()) {
         h2 -= power * hstack[i-n.size()] % P_M;
         if (h2 < 0)
            h2 += P_M;
      }
      if (i >= n.size()-1 && h1 == h2)
         return i - (n.size()-1);
   }
   return -1;
}
int main() {
   string s1, s2;
   cout<<"输入输入字符串:";
   getline(cin, s1);
   cout<<"输入要查找的字符串:";
   cin>>s2;
   if(rabin_karp(s2, s1) == -1)
      cout<<"未找到字符串<<endl;
   else
        cout<<"字符串"<<" "<<s2<<” “<<"在位置"<<rabin_karp(s2, s1)<<endl;
   return 0;
}

输出

输入输入字符串:Tutorialspoint
输入要查找的字符串:a
在位置 6 找到字符串 a
输入输入字符串:Tutorialspoint
输入要查找的字符串:b
未找到字符串

相关文章