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

パターン検索のためのラビン-カープアルゴリズムのCプログラム


Cでのパターンマッチング −文字列が別の文字列に存在するかどうかを確認する必要があります。たとえば、文字列「algorithm」は文字列「naivealgorithm」内に存在します。見つかった場合、その場所(つまり、存在する位置)は次のようになります。表示されます。2文字の配列を受け取り、matchingが発生した場合は位置を返し、それ以外の場合は-1を返す関数を作成する傾向があります。

Input: txt = "HERE IS A NICE CAP"
   pattern = "NICE"
Output: Pattern found at index 10
Input: txt = "XYZXACAADXYZXYZX"
   pattern = "XYZX"
Output: Pattern found at index 0
   Pattern found at index 9
   Pattern found at index 12

ラビン-カープ 別のパターン検索アルゴリズムです。より効率的な方法でパターンを見つけるためにRabinとKarpによって提案されたのは文字列マッチングアルゴリズムです。ナイーブアルゴリズムと同様に、ウィンドウを1つずつ移動してパターンをチェックしますが、すべての場合にすべての文字をチェックせずに、ハッシュ値を見つけます。ハッシュ値が一致すると、それだけが各文字のチェックに進みます。このように、テキストサブシーケンスごとに比較が1つしかないため、パターン検索のアルゴリズムがより効率的になります。

前処理時間-O(m)

ラビン-カープアルゴリズムの時間計算量はO(m + n)です。 、ただし、最悪の場合、 O(mn)

アルゴリズム

rabinkarp_algo(テキスト、パターン、素数)

入力 −メインテキストとパターン。検索ハッシュ位置のもう1つの素数

出力 −パターンが見つかった場所

Start
   pat_len := pattern Length
   str_len := string Length
   patHash := 0 and strHash := 0, h := 1
   maxChar := total number of characters in character set
for index i of all character in the pattern, do
   h := (h*maxChar) mod prime
for all character index i of pattern, do
   patHash := (maxChar*patHash + pattern[i]) mod prime
   strHash := (maxChar*strHash + text[i]) mod prime
for i := 0 to (str_len - pat_len), do
   if patHash = strHash, then
      for charIndex := 0 to pat_len -1, do
         if text[i+charIndex] ≠ pattern[charIndex], then
         break
if charIndex = pat_len, then
   print the location i as pattern found at i position.
if i < (str_len - pat_len), then
   strHash := (maxChar*(strHash – text[i]*h)+text[i+patLen]) mod prime, then
   if strHash < 0, then
   strHash := strHash + prime
End

#include<stdio.h>
#include<string.h>
int main (){
   char txt[80], pat[80];
   int q;
   printf ("Enter the container string \n");
   scanf ("%s", &txt);
   printf ("Enter the pattern to be searched \n");
   scanf ("%s", &pat);
   int d = 256;
   printf ("Enter a prime number \n");
   scanf ("%d", &q);
   int M = strlen (pat);
   int N = strlen (txt);
   int i, j;
   int p = 0;
   int t = 0;
   int h = 1;
   for (i = 0; i < M - 1; i++)
      h = (h * d) % q;
   for (i = 0; i < M; i++){
      p = (d * p + pat[i]) % q;
      t = (d * t + txt[i]) % q;
   }
   for (i = 0; i <= N - M; i++){
      if (p == t){
         for (j = 0; j < M; j++){
            if (txt[i + j] != pat[j])
            break;
         }
         if (j == M)
            printf ("Pattern found at index %d \n", i);
      }
      if (i < N - M){
         t = (d * (t - txt[i] * h) + txt[i + M]) % q;
         if (t < 0)
            t = (t + q);
      }
   }
   return 0;
}

出力

Enter the container string
tutorialspointisthebestprogrammingwebsite
Enter the pattern to be searched
p
Enter a prime number
3
Pattern found at index 8
Pattern found at index 21

  1. 平行四辺形の円周のためのCプログラム

    平行四辺形の辺が与えられ、タスクは、与えられた辺で平行四辺形の円周を生成し、結果を表示することです 平行四辺形とは何ですか? 平行四辺形は、-を持つ2次式の一種です。 反対側が平行 反対の角度は等しい ポリゴンの対角線は互いに二等分します 下の図に示されている「a」と「b」は、平行四辺形の辺であり、平行四辺形が図に示されています。 平行四辺形の周囲長/円周は次のように定義されます − 平行四辺形の円周=2(a + b) =2 * a + 2 * b 例 Input-: a = 23 and b = 12 Output-: Circumference of a paral

  2. 最適なページ置換アルゴリズムのためのC++プログラム

    与えられたページ番号とページサイズ。タスクは、最適なページ置換アルゴリズムを使用してメモリブロックをページに割り当てるときのように、ヒットとミスの数を見つけることです。 最適なページ置換アルゴリズムとは何ですか? 最適なページ置換アルゴリズムは、ページ置換アルゴリズムです。ページ置換アルゴリズムは、どのメモリページを置換するかを決定するアルゴリズムです。最適なページ置換では、実際には実装できませんが、近い将来に参照されないページを置換しますが、これは最適であり、ミスが最小限であり、最適です。 例を使って図式的に説明して理解しましょう。 ここで、1、2、3を割り当てた後、メモリが