2つの記号と与えられた場合、番目のフィボナッチ文字列を次のように定義してみましょう:
文字列の連結を示します。
したがって、次のようになります。
- ...
文字列が指定されたにより形成されたシンボル、我々は、任意のサブストリングとしてフィボナッチを定義するサブストリングのもの適切な選択のためのフィボナッチ列であると。
問題
与えられた場合、その最長のフィボナッチ部分文字列を検索します。
簡単なアルゴリズム
各位置のための列の、と仮定するが開始される(それがいることを確認するのに十分だ番目と番目のシンボルが明瞭です)。その場合は、、次になどに拡張できるかどうかを確認してください。その後、再び位置から始めます。位置達するまで繰り返します。S F (2 )i (i + 1 )F (3 )F (4 )i + 1 n
各シンボルを少なくとも1回は確認する必要があるため、です。forループは2つしか含まれていないため、さらにと言えます。O (n 2)
ただし、(多少驚くことではありませんが)この単純なアルゴリズムは、通常の2次アルゴリズムよりもはるかに優れています(番目の位置で多くの作業を行う場合、次の位置では多くの作業を行いません)。
フィボナッチプロパティを使用して、このアルゴリズムの実行時間のより厳しい境界を見つけるにはどうすればよいですか?