質問

単純な(ナイーブ?)回答はO(n)になります。ここで、nは短い文字列の長さです。最悪の場合、文字のペアをすべて比較する必要があります。

これまでのところ良く。 2つの等しい長さ文字列の確認がO(N)ランタイムを必要とすることがすべてo(n)ランタイムを必要とすると私たち全員が同意できると思います。

しかし、たくさんの(ほとんど?)言語(Python 3.7を使用しています)文字列の長さを格納して、一定の時間ルックアップを可能にします。そのため、2つの等しい長さ文字列の場合は、len(string_1) != len(string_2)を一定にするだけで簡単に確認できます。 Python 3が確かにこの最適化を行うことを確認できます。

今、2つのの任意の文字列(任意の長さの)の平等をチェックしている場合、それは弦が等しくないとはるかに低い(私は信じています)。等しい長さの。どちらの(統計的に)確実にそれらを常に一定に比較することができます。

だから我々は、o(n)の非常にまれな最悪の場合で、o(1)平均で2つの任意の文字列を比較することができます。弦の比較を次に(1)にすると、ハッシュテーブルルックアップがO(1)になると考えるのと同じように、o(1)になると思いますか?

役に立ちましたか?

解決

運転の期待時間の複雑さについて説明するために、入力に配布を指定する必要があります。 $ n $ が意味するものを説明する必要があります。

ただし、

は注意しなければならない。たとえば、コメント内の提案を検討するには、最大20の長さの単語にわたるある種の分布を考慮してください。この場合、文字列比較は明らかに $ o(1)$ は、20がただ一定です。それを回避する方法はいくつかあります:

  • 非漸近的な時間の複雑さを求めます。時間の複雑さは計算モデルに大きく依存しているので、アクセスする入力メモリセルの数を数えることができます。

  • パラメータ $ m $ に依存する入力分布を指定してから、 $ n $ の2つの場合、おおよそ4つのアクセスがあります。対照的に、文字列がコレクションからランダムに選択されている場合は、 $ 0 ^ i1 ^ {ni} $ から、アクセス数はおおよそ $(2/3)n $ 。これら2つの分布は、漸近的表記を使用していても分離することができます。アルゴリズムは、最初の配布で $ o(1)$ で実行され、 $ \ theta(n)$ 2番目の

    別の問題は、 $ n $ の意味です。たとえば、文字列 $ 0 ^ m $ を考慮して、 $ m \ sim g(1/2)$ 幾何学的ランダム変数です。長さ $ a、b $ の入力を実行すると、実行時間は $ \ theta(\ min(a、b)です。 ))$ $ n= a + b $ に関してこれをどのように表現するべきですか? 1つの選択肢は、入力長が $ n $ であることを考えると、予想される実行時間を要求することです。この場合、 $$ \ mathbb {e} [\ min(a、b)]=sum_ {a= 1} ^ {n-1} \ frac {(1/2)^ a(1/2)^ {n-1-a {\ sum_ {a '= 1} ^ {n-1}(1/2)^ {a'}(1/2)^ {n-1-a '}} \ min(a、na)=frac {1} {n-1} \ sum_ {a= 1} ^ {n-1} \ min(a、na)\ man {n} {4} $$ したがって、予想される実行時間は $ \ theta(n)$ です。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top