20230227 1.2. 什么是算法
定义
算法(Algorithm)
-
一个有限指令集
-
接受一些输入(有些情况下不需要输入)
-
产生输出
-
一定在有限步骤之后终止
-
每一条指令必须
-
有充分明确的目标,不可以有歧义
-
计算机能处理的范围之内
-
描述应不依赖于任何一种计算机语言以及具体的实现手段
-
什么是好的算法?
-
空间复杂度 S(n) —— 根据算法写成的程序在执行时 占用存储单元的长度 。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。
-
时间复杂度 T(n) —— 根据算法写成的程序在执行时 耗费时间的长度 。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。
在分析一般算法的效率时,我们经常关注下面两种复杂度
-
最坏情况复杂度 \(T_{worst}( n )\)
-
平均复杂度 \(T_{avg}( n )\)
[定义1.1] T (n) = O(f(n)) 表示存在常数c > 0, n0 > 0 ,使得当 n ≥ n0 时有 T (n) ≤ c f(n)
[定义1.2] T (n) = Ω(g(n)) 表示存在常数c > 0, n0 > 0 ,使得当 n ≥ n0 时有 T (n) ≥ c g(n)
[定义1.3] T (n) = Θ(h(n)) 表示,T (n) = O(h(n)) 同时T (n) = Ω(h(n))
函数 | 1 | 2 | 4 | 8 | 16 | 32 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 |
log2 n | 0 | 1 | 2 | 3 | 4 | 5 |
n | 1 | 2 | 4 | 8 | 16 | 32 |
n log2 n | 0 | 2 | 8 | 24 | 64 | 160 |
n2 | 1 | 4 | 16 | 64 | 256 | 1024 |
n3 | 1 | 8 | 64 | 512 | 4096 | 32768 |
2n | 2 | 4 | 16 | 256 | 65536 | 4294967296 |
n! | 1 | 2 | 24 | 40326 | 2092278988000 | 26313 1033 |
复杂度分析小窍门
-
若两段算法分别有复杂度T1 ( n) = O(f1 ( n)) 和 T2 ( n) = O(f2 ( n)),则
-
\(T1 ( n) + T2 ( n) = max( O(f1 ( n)), O(f2 ( n)) )\)
-
\(T1 ( n)*T2 ( n) = O( f1 ( n) * f2 ( n) )\)
-
-
若 T( n )是关于n 的 k阶多项式,那么T( n)=Θ ( n k )
-
一个for循环的时间复杂度等于循环次数乘以循环体
-
代码的复杂度
-
if-else 结构的复杂度取决于if的条件判断复杂度
-
和两个分枝部分的复杂度,总体复杂度取三者中最大