Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để triển khai Rolling Hash

Rolling hash là một hàm băm trong đó đầu vào được băm trong một cửa sổ di chuyển qua đầu vào.

Rabin-Karp là ứng dụng phổ biến của băm cuộn. Hàm băm cuộn được đề xuất bởi Rabin và Karp tính toán một giá trị nguyên. Đối với một chuỗi giá trị số nguyên là giá trị số của một chuỗi.

Thuật toán tìm kiếm chuỗi Rabin – Karp thường được giải thích bằng cách sử dụng một hàm băm cuộn rất đơn giản chỉ sử dụng phép nhân và phép cộng -

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

Trong đó, a là hằng số và c 1 , c 2 … .C k là các ký tự đầu vào. Để thao tác giá trị lớn của H, mod n được thực hiện.

Thuật toán

Begin
   Declare a constant variable P_B of the integer datatype.
      Initialize P_B= 227.
   Declare a constant variable P_M of the integer datatype.
      Initialize P_M= 1000005.
   Declare a hash() function
      Pass a string s as parameter.
      Declare r of the integer datatype.
         Initialize r = 0.
      for (int i = 0; i < s.size(); i++)
         r = r* P_B + s[i]
         r %= P_M
      return r
   Declare function rabin_karp(const string& n, const string& hstack)
      Declare h1 of the integer datatype.
         Initialize h1 = hash(n).
      Declare h2 of the integer datatype.
         Initialize h2 = 0.
      Declare power of the integer datatype.
         Initialize 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;
   Declare s1 and s2 to the string type.
   Print “Enter Input String:”
   Call getline(line, s1) to enter the string.
   Print “Enter string to find:”
   Take input for s2.
   if(rabin_karp(s2, s1) == -1)
      print” String not found”
   else
      print the string.
End.

Mã mẫu

#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<<"Enter Input String: ";
   getline(cin, s1);
   cout<<"Enter String to find: ";
   cin>>s2;
   if(rabin_karp(s2, s1) == -1)
      cout<<"String not found"<<endl;
   else
      cout<<"String"<<" "<<s2<<” “<<"found at position "<<rabin_karp(s2, s1)<<endl;
   return 0;
}

Đầu ra

Enter Input String: Tutorialspoint
Enter String to find: a
String a found at position 6
Enter Input String: Tutorialspoint
Enter String to find: b
String not found