O (landau symbol) について
LT at chibapm #5
who am i
- kobaken ( @kfly8 )
- Application Engineer
- like Perl, JS
- Work
- Mobile Factory
- YAPC::Asia staff
- 五反田もくもく会
今日話したいこと
- O (landau symbol) について
気が狂って数学っぽい話
身近な用途
計算量のあたりをつけるのに使う記号
よくある用途
- 最良の計算量はでどれくらい?
- 最悪の計算量はでどれくらい?
- 最悪の計算量はでどれくらい?
例えば、二分探索
- 最良は、1発正解なので、O(1)
- 最悪は、最後まで当たらんことなので、半分ずっこずつけずって探して行くので、、O(log2(n))
- 平均は、ごにょごにょして、O((1+1/n)log n)
O(landau symbol)
DEFINITION
x = a の十分近くで、ある正数cが存在して、
|f(x)| <= c |g(x)| となるとき
f(x) = O(g(x)) when x -> a
と表す
租借すると
- x=aの近くでf(x)がg(x)の定数倍に抑えられている
- 元のfが"複雑"な時、扱いやすいような基本的な関数 g で表すこと考える
- gがよりfに近いと、いいあたりになってる
小まとめ
- ランダウ記号は、あたりを表すための道具
ところで
あたりをつけると言えば、微分
テイラー展開
- xがaに十分に近いなら多項式の和で表せる
- 適当な範囲では、多項式で表せる
f(x) = Σdf^n/dx(a) * 1/n! (x - a)^n when x -> a
ちょっとこれだと、項が多すぎて扱いずらいなら ランダウ記号で項を落とす
f(x) = df/dx(a) + O(x^2) when x -> a
雑談
- 微分、計算カンタンで、精度最高で最高
- 他方、平均の計算量もとめようとすると、ただ積分することになるから、積分だから面倒。ただの愚痴
話を戻す
よくある用途
- 最良の計算量はでどれくらい?
- 最悪の計算量はでどれくらい?
- 最悪の計算量はでどれくらい?
どれくらいの計算量か肌感を知りたいなら、 まずは抑える関数を知っておく
上から順に素敵
- 定数関数 O(1) / 最高の世界観
- 対数関数 O(log n)
- だいたい線形 O(n log n)
- 線形(1次多項式) O(n)
- 多項式 O(n^2)..
- 指数関数 O(e^n)
- 階乗関数 O(n!)
- 定数関数 O(1) / 最高の世界観
以上
ご清聴ありがとうございました。
株式会社モバイルファクトリー は、
開発好きなエンジニアを求めています。