以前在玩程序竞赛的时候。经常跟朋友讨论算法复杂度:
- “这个算法复杂度是 O ( n 2 ) O(n^2) O(n2),肯定爆掉了,这道题要用 O ( n log n ) O(n\log{n}) O(nlogn)的算法”
类似的讨论非常多。但当时没深究过这个O到底是如何定义出来的,一直以为它跟数学分析里的高阶无穷小之类的是否有关系。上了大学课上的情报数学后,终于慢慢揭开了O的面纱。这里就来分享给还没学过的朋友。
定义1
对于函数 f : N → N , g : N → N f:\mathbb{N}\rightarrow \mathbb{N},g:\mathbb{N}\rightarrow \mathbb{N} f:N→N,g:N→N ,若满足
∃ n o ∈ N , ∃ c ∈ R s . t . ∀ n ∈ N n ≥ n o ⇒ f ( n ) ≤ c g ( n ) \exist n_o \in \mathbb{N}, \exist c \in \mathbb{R}\quad s.t. \quad\forall n\in \mathbb{N} \\ n \geq n_o \Rightarrow f(n)\leq cg(n) ∃no∈N,∃c∈Rs.t.∀n∈Nn≥no⇒f(n)≤cg(n)
则可写作
f ( n ) = O ( g ( n ) ) f(n)=O(g(n)) f(n