第0章 序言
· Fibonacci数列
0,1,1,2,3,5,8,13,21,34…
数列中每个数都是其两个直接前项的和。
F
n
F_{n}
Fn的生成规则:
F
n
=
{
F
n
−
1
+
F
n
+
1
n
>
1
1
n
=
1
0
n
=
0
F_{n}=\left\{\begin{matrix}F_{n-1}+F_{n+1} &n>1 & \\ 1&n=1 & \\ 0 & n=0 \end{matrix}\right.
Fn=⎩⎨⎧Fn−1+Fn+110n>1n=1n=0
Fibonacci数增长速度几乎与2的幂增长速度相同。一般而言, F n ≈ 2 0.694 n F_{_{n}}\approx 2^{0.694n} Fn≈20.694n
· 摩尔定律
计算机的运算速度一直以每18个月翻一番的速度迅猛提升。
· 大O符号
以基本操作次数来表征算法的运行时间,是一种简化。因为一次操作所耗费的时间主要依赖于特定的处理器,还可能依赖于缓存策略等细节。
衡量算法的性能,需要一种简洁的、与机器无关的标准。为此,我们通常采用对算法的基本操作次数进行计数的方式来表征算法的运行时间,而基本操作次数是算法输入规模的函数。
简化来讲,当输入规模是
n
n
n时,算法的运行时间为
O
(
n
3
)
O(n^{3})
O(n3)(读作,大
O
n
On
On立方)。
大
O
O
O符号的精确定义。假设当算法输入规模是n时,两个算法的运行时间分别为
f
(
n
)
f(n)
f(n)和
g
(
n
)
g(n)
g(n)。
令
f
(
n
)
f(n)
f(n)和
g
(
n
)
g(n)
g(n)均为从正整数到正实数的函数。如果存在一个常数
c
>
0
c>0
c>0,使得
f
(
n
)
≤
c
⋅
g
(
n
)
f(n)\leq c\cdot g(n)
f(n)≤c⋅g(n)成立,则我们称
f
=
O
(
g
)
f=O(g)
f=O(g)(意味着“
f
f
f增长的速度慢于g”)
大O符号用于描述函数渐进行为的数学符号。更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。即用一个大O,在其括号()中,用另一个函数来描述原来的函数的数量级的渐进上界。
某个算法的时间复杂度是O(1),就说明这是一个优秀的算法。
某个算法的时间复杂度是O(logn),就说明这是一个良好的算法。
某个算法的时间复杂度是O(n),就说明这个算法还不错。
某个算法的时间复杂度是O(n2),就说明这个算法差一些了。
无穷大接近
例如,解决一个规模为 n 的问题所花费的时间(或者所需步骤的数目)为:
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 = 500,4n^2; 项是 2n 项的1000倍大,因此在大多数场合下,省略后者对表达式的值的影响将是可以忽略不计的。
进一步看,如果我们与任一其他级的表达式比较,n^2; 项的系数也是无关紧要的。
这样,大O符号就记下剩余的部分,写作:
T(n)∈O(n^2)
并且我们就说该算法具有2阶的时间复杂度。
T(n)=O(n^2)
无穷小接近
大O也可以用来描述数学函数估计中的误差项。例如:
e
x
=
1
+
x
+
1
2
x
2
+
O
(
x
3
)
e^{x}=1+x+\frac{1}{2}x^{2}+O(x^{3})
ex=1+x+21x2+O(x3) 当 x→0 时
这表示,如果 x 足够接近于0,那么误差(
e
x
=
1
+
x
+
1
2
x
2
e^{x}=1+x+\frac{1}{2}x^{2}
ex=1+x+21x2的差)的绝对值小于
x
3
x^{3}
x3的某一常数倍。
· 时间复杂度(Time Complexity)
时间复杂度是同一问题可用不同算法解决,而一个算法质量的优劣将影响到算法乃至程序的效率。
在计算机科学中,算法的复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。
时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被成为是渐进的,它考察当输入值大小趋近无穷时的结果。
计算方式
一般情况下,算法中基本操作重复执行的次数,是问题规模 n n n的某个函数,用 T ( n ) T(n) T(n)表示,若有某个辅助函数 f ( n ) f(n) f(n),使得 T ( n ) / f ( n ) T(n)/f(n) T(n)/f(n)的极限值( n n n趋于无限大)为不等于0的常数,则成 f ( n ) f(n) f(n)是 T ( n ) T(n) T(n)同数量级函数。记作 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n)),称 O ( f ( n ) ) O(f(n)) O(f(n))为算法的渐进时间复杂度,简称时间复杂度。
随着规模n的增大,算法执行的时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。