时间复杂度和空间复杂度
时间复杂度
- 用大 \(O\) 表示。
- 去掉系数和常数,如果有两个常数项,择取最大值。如:
\[F(N)=2*N+N^2+10=O(N^2)
\]
\[F(N)=a+b=O(max(a,b))
\]
- 在现实中,一般用程序运行的最坏情况来计时间复杂度。
- 另外,如果程序的运行次数是一个常数(与 \(n\) 无关),那记为 \(O(1)\) .
- 在时间复杂为 \(O(\log_xN)\) 时,当底数 \(x\) 为常数时,表达式可省略成 \(O(\log N)\) .
- 二分查找时间复杂度推导:
- 设 \(\mathrm{begin=1,ned=}\ N\) ,则在最坏情况下,要查找到 \(\mathrm{begin=end}\) 时结束。设要查找的数始终在 \(\mathrm{mid}\) 前面。所以(设除了 \(x\) 个 \(2\) ):\[N/2/2/2/2/.../2=1(\mathrm{begin=end}) \]\[2^x=N \]\[x=\log_2N \]所以二分查找的时间复杂度为:\[O(\log N) \]
- 设 \(\mathrm{begin=1,ned=}\ N\) ,则在最坏情况下,要查找到 \(\mathrm{begin=end}\) 时结束。设要查找的数始终在 \(\mathrm{mid}\) 前面。所以(设除了 \(x\) 个 \(2\) ):
- 调和级数的时间复杂度为 \(O(n\ \log N)\) ;
- 全排列函数的时间复杂度为 \(O(n!)\) ;
- 二进制拆分的时间复杂度是 \(𝑂(𝑙𝑜𝑔 \ 𝑛)\)
\(O(1)\) | \(O(n)\) | \(O(n \log\ n)\) | \(O(n^2)\) | \(O(n!)\) | \(O(n\sqrt n)\) |
---|---|---|---|---|---|
无敌 | \(1e7\) | \(1e6-5e6\) | \(5000\) | \(13\) | \(1e5\) |