big O notation - 大 O 表示法
Big O notation (with a capital letter O, not a zero), also called Landau’s symbol.
大 O 表示法 (大写字母 O,不为零),也称为 Landau’s symbol。
Big O notation is a mathematical notation that describes the limiting behavior of a function when the argument tends towards a particular value or infinity.
大 O 表示法是一种数学表示法,用于描述参数趋于特定值或无穷大时函数的限制行为。
大 O 符号 (big O notation),又称为渐进符号,用于描述函数渐近行为的数学符号。它是用另一个 (通常更简单的) 函数来描述一个函数数量级的渐近上界
。在数学中,它一般用来刻画被截断的无穷级数尤其是渐近级数的剩余项。
代表 order of … (… 阶) 的大 O,最初是一个大写希腊字母 Ο (omicron),现今用的是大写拉丁字母 O。
1. 无穷大渐近
对于 T ( n ) = 4 n 2 − 2 n + 2 T(n) = 4n^{2} - 2n + 2 T(n)=4n2−2n+2,当 n n n 增大时, n 2 n^{2} n2 项将开始占主导地位,而其他各项可以被忽略。当 n = 500 n = 500 n=500, 4 n 2 4n^{2} 4n2 项是 2 n 2n 2n 项的 1000 倍大,因此在大多数场合下,省略后者对表达式的值的影响将是可以忽略不计的。
如果我们与任一其他级的表达式比较, n 2 n^{2} n2 项的系数也是无关紧要的。一个包含 n 3 n^{3} n3 或 n 2 n^{2} n2 项的表达式,即使 T ( n ) = 1 , 000 , 000 ⋅ n 2 T(n) = 1,000,000 \cdot n^{2} T(n)=1,000,000⋅n2,假定 U ( n ) = n 3 U(n) = n^{3} U(n)=n3,一旦 n n n 增长到大于 1,000,000
,后者就会一直超越前者 ( T ( 1 , 000 , 000 ) = 1 , 000 , 00 0 3 = U ( 1 , 000 , 000 ) T(1,000,000) = 1,000,000^{3} = U(1,000,000) T(1,000,000)=1,000,0003=U(1,000,000))。
针对第一个例子 T ( n ) = 4 n 2 − 2 n + 2 T(n) = 4n^{2} - 2n + 2 T(n)=4n2−2n+2,大 O 符号就记下剩余的部分,写作:
T ( n ) ∈ O ( n 2 ) T(n)\in \mathrm {O} (n^{2}) T(n)∈O(n2)
或
T ( n ) = O ( n 2 ) T(n)=\mathrm {O} (n^{2}) T(n)=O(n2)
并且我们说该算法具有 n 2 n^{2} n2 阶 (平方阶) 的时间复杂度。
推导大 O 阶:
- 用常数 1 取代运行时间中的所有加法常数。
- 在修改后的运行次数函数中,只保留最高阶项。
- 如果最高阶项存在且不是 1,则去除与这个项相乘的常数。得到的结果就是大 O 阶。
2. big O notation - 大 O 表示法
假设列表包含 n
个元素。简单查找需要检查每个元素,因此需要执行 n
次操作。使用大 O 表示法,这个运行时间为 O(n)
。大 O 表示法指的并非以秒为单位的速度。大 O 表示法让你能够比较操作数,它指出了算法运行时间的增速。
大 O 表示法说的是最糟的情形。在最糟情况下,必须查看电话簿中的每个条目,对应的运行时间为 O(n)
。这是一个保证,简单查找的运行时间不可能超过 O(n)
。
- O( log 2 n \log_2^n log2n),对数时间,这样的算法包括二分查找。
- O( n n n),线性时间,这样的算法包括简单查找。
- O( n ∗ log 2 n n * \log_2^n n∗log2n),这样的算法包括快速排序 (一种速度较快的排序算法)。
- O( n 2 n^2 n2),这样的算法包括选择排序 (一种速度较慢的排序算法)。
- O( n ! n! n!),一种非常慢的算法。
2.1 时间复杂度
- 算法的速度指的并非时间,而是操作数的增速。
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
- 算法的运行时间用大 O 表示法表示。
- O( log 2 n \log_2^n log2n) 比 O( n n n) 快,当需要搜索的元素越多时,前者比后者快得越多
References
http://web.mit.edu/16.070/www/lecture/big_o.pdf
https://www.freecodecamp.org/news/the-top-data-structures-you-should-know-for-your-next-coding-interview-36af0831f5e3/
https://data-structure-and-algorithm.gitbook.io/project/
大话数据结构 - 程杰
https://en.wikipedia.org/wiki/Big_O_notation