最長のフィボナッチ部分文字列を見つけるための単純なアルゴリズムの複雑さ


10

2つの記号と与えられた場合、番目のフィボナッチ文字列を次のように定義してみましょう:abk

F(k)={bif k=0aif k=1F(k1)F(k2)else

文字列の連結を示します。

したがって、次のようになります。

  • F(0)=b
  • F(1)=a
  • F(2)=F(1)F(0)=ab
  • F(3)=F(2)F(1)=aba
  • F(4)=F(3)F(2)=abaab
  • ...

文字列が指定されたにより形成されたシンボル、我々は、任意のサブストリングとしてフィボナッチを定義するサブストリングのもの適切な選択のためのフィボナッチ列であると。SnSab

問題

与えられた場合、その最長のフィボナッチ部分文字列を検索します。S

簡単なアルゴリズム

各位置のための列の、と仮定するが開始される(それがいることを確認するのに十分だ番目と番目のシンボルが明瞭です)。その場合は、、次になどに拡張できるかどうかを確認してください。その後、再び位置から始めます。位置達するまで繰り返します。S F 2 i i + 1 F 3 F 4 i + 1 niSF(2)i(i+1)F(3)F(4)i+1n

各シンボルを少なくとも1回は確認する必要があるため、です。forループは2つしか含まれていないため、さらにと言えます。O n 2Ω(n)O(n2)

ただし、(多少驚くことではありませんが)この単純なアルゴリズムは、通常の2次アルゴリズムよりもはるかに優れています(番目の位置で多くの作業を行う場合、次の位置では多くの作業を行いません)。i

フィボナッチプロパティを使用して、このアルゴリズムの実行時間のより厳しい境界を見つけるにはどうすればよいですか?

回答:


5

言う発生し、その位置で開始するサブストリングのいずれかと互換性がある場合、いくつかの位置またはその相補。オカレンスはどのくらい近くなることができますか?例としてます。場合の位置で起こる、それは位置で発生することができない、またはが、位置に現れることができ。我々はせの2つの存在するように、最小の数でありの距離で発生する可能性が。帰納法により、について、F(n) F(n)F(n)F(4)=abaabF(4)pp+1p+2p+3(n)F()n4(n)=|F(n1)|(たとえば、)。(4)=3

長さ文字列が与えられた場合、各、をが発生する位置のセットとする。プロシージャの実行時間の上限は、おおまかにできますここで、全てにわたる合計実行よう(たとえば)。出現は少なくともで区切られているため 、実行時間は順序によって制限されていることがわかります フィボナッチワードの長さが指数関数的に増加するため、。残りの項はNnP(n)F(n)n|P(n)||F(n)|n|F(n1)|NF(n)|F(n1)|

n|F(n)|(N|F(n1)|+1).
n|F(n)|=O(N)nO(N)=O(NlogN)、合計にはの項が含まれるため。実行時間はと結論付け。logNO(NlogN)

逆に、の実行時間は、帰納法で証明されます。長さ文字列の最悪の実行時間はと結論付け。 Ω | F N |ログ| F N |N Θ N ログN FnΩ(|Fn|log|Fn|)NΘ(NlogN)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.