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

C ++のZアルゴリズム(線形時間パターン検索アルゴリズム)


Zアルゴリズム 線形時間で文字列内のパターンの出現を見つけるために使用されます。文字列の長さがnで、検索するパターンのサイズがmの場合、解決にかかる時間は O(m + n)のオーダーになります。 。

zアルゴリズムは、Z配列を使用してパターンの出現を検出します。

Z配列

文字列と同じ長さの配列です。 z配列の各要素は、文字列自体のプレフィックスとして使用できるIから始まる文字列の最長のサブ文字列の長さで構成されます。

アルゴリズム

このアルゴリズムでは、長さnの文字列Sと、長さmの検索対象パターンpが与えられます。

z配列を作成します。ここで、アルゴリズムはi=1からn-1までの文字列のすべての文字をループします。ここで、1≤L≤I≤Rとなるプレフィックスサブストリングであるサブストリングs[L-R]を作成します。

ここで、i-1およびi-1までのすべてのz値のサブストリング[L、R]を作成するための正しい間隔について。次の手順を使用して、z [i]と新しい間隔[L、R]を計算します-

Step1: if i > R, no larger prefix-substring is possible. So, we will compute new interval bt comparing 
S[0] to S[i] i.e. string starting from index 0 i.e. from start with substring starting from index i. 
And find z[i] using z[i] = R - L + 1.
Step 2: Else if, i ≤ R, [L, R] can be extended to i. For k = i-L, z[i] ≥ min(Z[k], R-i+1).
   Step 2.1: If, Z[k] < R-i+1, no longer prefix substring s[i] exist.
   Step 2.2: If Z[k] ≥ R-i+1, then there can be a longer substring. So, we will update [L, R] by changing L = i and changing R by matching from S[R+1].

このプロセスは、1回の反復ですべてのZ値を検出します(1回だけループします)。

アルゴリズムの実装を示すプログラム-

#include<iostream>
using namespace std;
void createZarray(string str, int Z[]){
   int n = str.length();
   int L, R, k;
   L = R = 0;
   for (int i = 1; i < n; ++i){
      if (i > R){
         L = R = i;
         while (R<n && str[R-L] == str[R])
         R++;
         Z[i] = R-L;
         R--;
      } else {
         k = i-L;
         if (Z[k] < R-i+1)
            Z[i] = Z[k];
         else {
            L = i;
            while (R<n && str[R-L] == str[R])
               R++;
            Z[i] = R-L;
            R--;
         }
      }
   }
}
void zAlgorithm(string text, string pattern){
   string str = pattern+"$"+text;
   int len = str.length();
   int Z[len];
   createZarray(str, Z);
   for (int i = 0; i < len; ++i){
      if (Z[i] == pattern.length())
         cout<<(i-pattern.length()-1)<<"\t";
   }
}
int main(){
   string str = "Hello! Welcome To tutorials Point programming tutorial";
   string pattern = "tutorial";
   cout<<"The patter ' "<<pattern<<" ' is found in the string '"<<str<<" ' at index \t";
   zAlgorithm(str, pattern);
   return 0;
}

出力

The patter ' tutorial ' is found in the string 'Hello! Welcome To tutorials Point programming tutorial ' at index 18 46

  1. C /C++でのバークレーのアルゴリズム

    バークレーのアルゴリズムは、分散システムのクロック同期に使用されるアルゴリズムです。このアルゴリズムは、分散ネットワークの一部またはすべてのシステムにこれらの問題のいずれかがある場合に使用されます- A.マシンには正確なタイムソースがありません。 B.ネットワークまたはマシンにUTCサーバーがありません。 分散システム 物理的に分離されているが、ネットワークを使用して相互にリンクされている複数のノードが含まれています。 バークレーのアルゴリズム このアルゴリズムでは、システムはノードをマスター/リーダーノードとして選択します。これは、サーバーのプールノードから実行され

  2. パターン検索用の有限オートマトンアルゴリズム用のC++プログラム

    この記事では、パターン検索用の有限オートマトンアルゴリズムを実行するプログラムについて説明します。 テキスト[0...n-1]とパターン[0...m-1]が提供されます。 text[]内のpattern[]のすべての出現を見つける必要があります。 このために、text []を前処理し、それを表す2次元配列を作成します。その後、text[]の要素とオートマトンのさまざまな状態の間を移動する必要があります。 例 #include<stdio.h> #include<string.h> #define total_chars 256 int calc_nextstate(