C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

ローリングハッシュを実装するC++プログラム


ローリングハッシュは、入力を移動するウィンドウで入力がハッシュされるハッシュ関数です。

Rabin-Karpは、ローリングハッシュの一般的なアプリケーションです。ラビンとカープによって提案されたローリングハッシュ関数は整数値を計算します。文字列の場合、整数値は文字列の数値です。

ラビン-カープ文字列検索アルゴリズムは、乗算と加算のみを使用する非常に単純なローリングハッシュ関数を使用して説明されることがよくあります-

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

ここで、aは定数、c 1 、c 2 ….ck 入力文字です。 Hの巨大な値を操作するために、modnが実行されます。

アルゴリズム

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.

サンプルコード

#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;
}

出力

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

  1. AVLツリーを実装するためのC++プログラム

    AVLツリーは自己平衡二分探索木であり、左右のサブツリーの高さの差がすべてのノードで複数になることはありません。 ツリーの回転は、AVLツリーの要素の順序を妨げることなく構造を変更する操作です。ツリー内で1つのノードを上に移動し、1つのノードを下に移動します。これは、ツリーの形状を変更したり、小さいサブツリーを下に移動したり、大きいサブツリーを上に移動したりして高さを低くしたりするために使用され、多くのツリー操作のパフォーマンスが向上します。回転の方向は、木のノードが移動する側に依存しますが、他の人は、どの子がルートの場所をとるかに依存すると言います。これは、AVLツリーを実装するためのC+

  2. STLにSet_Symmetric_differenceを実装するC++プログラム

    これは、set_symmetric_differenceを実装するためのC++プログラムです。 2つのセットの対称差は、一方のセットには存在するが、もう一方のセットには存在しない要素によって構築されます。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin    Declare set vector v and iterator st.   Initialize st = set_symmetric_difference (set1, set1 + n, set2, se