計算量ってパッとわからないので勉強
再帰アルゴリズムの計算量算出
leetcode で再帰アルゴリズムの勉強をしていて、 O(n) とか O(n2-1) とかでてきてもパッと想像できない。
何かがわかってないのだろうけど、なかなかきついのでちゃんと勉強してみた。
せっかく勉強したのでメモっておく。
O(T) は通情再帰呼び出し数と時間の積になる。再帰の回数を R とし再帰呼び出し毎にかかる時間の複雑さ (time complextly of calicuration) は O(s) とすると O(T) = R * O(s) の式で表すことができる。
書いてたらなんとなくわかってきた。
フィボナッチ数列を brute force で計算した時の計算量は binary tree の node の数が再帰の数になるので 2n -1 回で1つあたりの計算時間は一定だから O(2n) ということになる。(-1 は計算量として誤差なので省略
以下は実際のコードのタイム
# n = 50 12586269025 go run . 73.30s user 0.35s system 99% cpu 1:13.70 total
メモ化すると計算時間は一定のまま n 回の計算量で住むので O(n) になる。
以下はメモ化時のタイム
# n = 50 12586269025 go run . 0.24s user 0.21s system 100% cpu 0.441 total
なるほど、理解できてきたかも。
メモ化の基本的な動きと計算量の簡単な出し方が学べたので満足。
とか言ってたらまたこんな時間だ...