再帰的フィボナッチアルゴリズムの複雑さ


13

次の再帰フィボナッチアルゴリズムを使用します。

def fib(n):
   if n==0:
      return 0
   elif n==1
      return 1
   return (fib(n-1)+fib(n-2))

fib(5)を見つけるために数値5を入力した場合、これが5を出力することがわかりますが、このアルゴリズムの複雑さをどのように調べることができますか?関連するステップを計算するにはどうすればよいですか?



私は同じものを探していたので、MyCodeSchoolがこのビデオに手を出しました。これをチェックすることをお勧めします。
— snbk97

回答:


23

ほとんどの場合、再帰方程式を使用して再帰アルゴリズムを表現できます。この場合、このアルゴリズムの再帰方程式はです。次に、置換法または展開法(または再帰の解決に使用される他の方法)を使用して、方程式の閉じた形式を見つけることができます。この場合、を取得します。ここで、は黄金比(\ phi = \ frac {(1 + \ sqrt {5})} {2})です。T (n )= Θ (ϕ n)ϕ ϕ = (1 + √T(n)=T(n−1)+T(n−2)+Θ(1)T(n)=Θ(ϕn)ϕϕ=(1+5)2

再発を解決する方法についてさらに知りたい場合は、アルゴリズムの概要の第4章を読むことを強くお勧めします。


0

繰り返しの関係/数学分析の代替として(しかし代替ではない)、クラスではあまり頻繁に教えられていないが非常に有益な単純な経験的演習は、関数の実行回数をカウントし、範囲のカウントをグラフ化することですn個の小さな入力から、結果を曲線近似します。結果は、一般的に理論的な数学アプローチとほぼ一致します。

この演習の優れたサポート資料は、無料のオンラインの第3章、アルゴリズムの実行時間 / コンピューターサイエンスの基礎、ウルマンにあります。


1)プロットは、正式な分析に代わるものではありません。簡単にだまされます。2)引用元を誤って伝えていると思います。彼らはプロットについて言及しているが、「複雑さ」を決定する方法としてではない。3)FWIW、私はこのアプローチに同意せず、Ullmanが提示するようにそれを使用していますが、それはあなたのせいではありません。
— ラファエル

1
答えは基本的に免責事項から始まります。つまり、プロットは数学分析の代わりではないということです。プロットは科学的な方法であり、それが時々だまされると言う/観察することは、データの統計的側面について学ぶ/呼び出すことです。これは科学分析のもう1つの重要な側面です。「簡単にだまされている」と言うのはかなりドラマチックで、失敗すると「病理学的」なケースがありますが、通常は「だまされている」と考えてください...質問はアルゴリズムの複雑さを検証し、実証分析が重要な側面である/その上の角度、及び明らかではない唯一の角度など...
— vzn

0

fib(n)の結果は、1を返したすべての再帰呼び出しの合計です。したがって、fib(1)を評価するfib(n)再帰呼び出しが正確にあります。したがって、実行時間はΩ(fib(n))です。0を返す呼び出しと他の再帰呼び出しがこれに大きく追加しないことを示す必要があります。

同じ推論は、1、0、または別の再帰呼び出しの結果を返す再帰的に定義された関数にも適用されます。


「少なくともO(fib(n))」-それは意味をなさない。を使用します。Ω
— ラファエル

あなたがそれについて強く感じるなら、答えを自由に編集してください。
— gnasher729

0

下限直感的である: ので、 よってT(n)=T(n−1)+T(n−2) T(n)>2T(n−2)T(n−1)>T(n−2)T(n)=Ω(cn)

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