2016-12-11 18 views
-1

私は「文字列検索アルゴリズム」の解決しようとしていますが、多くのサイトの答えがO(mは複雑(「ナイーブ文字列検索」のようです(N- KMPO(n)のので、私は間違いなく間違っている、しかしどこ?文字列探索 - 一致する文字列の複雑

必要がありますがありながら、M + 1))、以下の私のALGOの問題何だ、それは、O(n)との最悪の場合の複雑さを持っています
def find(s1, s2): 
    size = len(s1) 
    index = 0 
    while (index != len(s2)): 
     if s2[index : index + size] == s1: 
      print 'Pattern found at index %s'%(index) 
      index += size 
     else: 
      index += 1 

だから私はs2[index : index + size] == s1がOであると仮定していた両方のハッシュが等しい文字列である場合(1)O(N)であり、ここで私の元の質問になり、

  • なぜ等しくなければならない、二つの文字列を計算し、比較のハッシュではありません。
  • どうやって衝突するのか分かりません。それはハッシュアルゴリズムに依存しません。 MD5のように既知の改行があります。
+1

あなたは 's2 [index:index + size] == s1'がO(1)であると仮定しています。それは...ですか? – kumardeepakr3

+0

s2 [index:index + size]のハッシュは、O(len(s1))時間よりも短く計算されるでしょうか?ローリングハッシュ(Rabin-Karpと全く同じ)を使ってこれを行うことは可能ですが、あなたは何とかこれを行うべきだと示唆しているようです。 https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithmはこれをカバーしています。 –

+0

@PaulHankin thx、文字列検索が簡単で、まばたきしていると仮定するのは素朴です。長年の研究を読もうとしています。 – garg10may

答えて

1

オリジナル質問

私はあなたのコードは複雑性O(n)を持っていると思うのではなく、O(MN)。このチェックはs2[index : index + size] == s1です。最悪の場合、len(s1)の文字比較が必要なためです。

をハッシュ


Wikipedia's definition of a hash function

ここです:

ハッシュ関数は、固定サイズのデータ​​に 任意のサイズのデータ​​をマッピングするために使用することができる任意の関数です。ハッシュ 関数によって返される値は、ハッシュ値、ハッシュコード、ダイジェスト、または単に ハッシュと呼ばれます。 1つの用途はハッシュテーブルと呼ばれるデータ構造であり、高速データ検索のためにコンピュータソフトウェアで広く使用されている。

ここでは、このアプローチで最初の問題にぶつかります。ハッシュ関数は任意の大きさの値をとり、固定サイズの値を返します。 pigeonhole principleに続いて、複数の値を持つ少なくとも1つのハッシュがあります。簡単な例として、ハッシュ関数が常に1バイト長の出力を生成するとします。つまり、可能な出力は256です。 257アイテムをハッシュした後、同じハッシュを持つアイテムが少なくとも2つあることは常に確実です。これをできるだけ避けるために、良いハッシュ関数は可能な限りすべての可能な出力の入力をuniformlyとしてマップします。

ハッシュが等しくない場合、文字列が等しくないことを確認できますが、逆も同様です。 2つの異なる文字列に同じハッシュを付けることができます。

+0

okだから、文字列の比較の複雑さはO(n)ですが、それはなぜですか、文字列と比較の両方のハッシュを計算することはできませんO(1) – garg10may

+1

@ garg10mayはい、ハッシュが衝突する可能性がありますだから、期待通りの時間で実行され、最悪ではなく、Rabin-Karpという名前を持っているアルゴリズムを見ている。 –

+0

ハッシュアルゴリズムの内部についてはよく分かりませんが、ハッシュのプロパティの1つは、文字列内の文字が変更された場合に変更する必要があるため、文字列内のすべての文字を参照する必要がありますハッシュを計算します。つまり、少なくとも 'O(n)'です。ここで 'n'はハッシュしている文字列の長さです。また、文字列のハッシュは、部分文字列のハッシュについて何も教えてくれないので、長さ 'm'のすべての部分文字列に対して行う必要があります。 – bigblind