アルゴリズム

皆dankogaiが大好きだね.

O記法の定義

O(f(n))={g(n) | ある定数Nと定数cが存在してn\geq Nならばg(n)\leq c f(n)}.
\phi=(1+\sqrt{5})/2としてO(\phi^n)\subseteq O(2^n)なのでナイーブな実装の関数呼び出し回数をO(2^n)と言うのは間違いではない. 漸近的にしか評価してないんだから.
これは某コメントに向けて

O記法を何を評価するために使っているか

関数の呼び出し回数. (向こうのコメント欄に全体の計算量と誤解している人が居る.)
TM的な定義では足し算や掛け算にも時間が掛かるので計算時間のオーダーも増える.

その他

  • \phi^nを計算するのには繰り返し二乗法で掛け算を高々2log(n)回. ただ実数計算はしたくないのでc_n=(a_n+b_n\sqrt{5})/2とおいてa_n, b_nを計算した方が良い.
  • O()という書き方は誤解を招くよね.
  • 知っている人は自動補完されるからいいけど, 知らない人に教える記事として読むと定義と正確性に問題があるよね.
  • あとメモ化のときの最初の呼び出し回数の評価も間違ってるよね. 1回目は関数をナイーブな実装で評価するから.

補遺

アルゴリズム

影響力がありそうな方の次のエントリ2つを見て,

アルゴリズムについてこうなんというか不正確な記述がたくさんあって,書いている本人が理解してるかどうかも判断しにくい文章にたくさんブックマークがついていて,しかもそのような方がアルゴリズムに関する書籍を執筆しようとしているという状況がなんかこわいです.

岡本先生頑張って下さい(w