【见解】关于算法复杂度的理解不能只停留在根据代码直接凭感官或者经验直接推测其公式(例如:根据for循环直接推测出一个O(n)复杂度,关于复杂度的理解更应该深入到其所代表的函数空间中去。
1.渐进记号
渐进记号:用来描述算法渐进运行时间的记号,其定义域为自然数集合N={
0,1,2,3...}N=\{0,1,2,3...\}N={
0,1,2,3...}。
【渐进记号可刻画算法的运行时间, 也可以刻画算法的某个其他方面(例如,算法的空间数量),甚至可以是和算法没有任何关系的函数。】
1.1 Θ\ThetaΘ记号
【定义】
用 Θ(g(n))\Theta(g(n))Θ(g(n))来表示以下函数的集合:Θ(g(n))={ f(n):存在正常量c1,c2和n0,使得对所有n≥n0,有0≤c1∗g(n)≤f(n)≤c2∗g(n)}\Theta(g(n)) = \{f(n):存在正常量c_1, c_2 和n_0,使得对所有 n\ge n_0, 有 0 \leq c_1*g(n) \leq f(n) \leq c_2*g(n)\}Θ(g(n))={ f(n):存在正常量c1,c2和n0,使得对所有n≥n0,有0≤c1∗g(n)≤f(n)≤c2∗g(n)}
该记号渐近得给出一个函数的上界和下界。
【谨记】
Θ(g(n))\Theta(g(n))Θ(g(n))表示的是一个集合,可以记f(n)∈Θ(g(n))f(n)\in\Theta(g(n))f(n)∈Θ(g(n)) 用来指出f(n)是Θ(g(n))的成员f(n)是\Theta(g(n))的成员f(n)是Θ(g(n))的成员。 Θ(g(n))\Theta(g(n))Θ(g(n))的定义要求每个成员f(n)∈Θ(g(n))f(n)\in \Theta(g(n))f(n)∈Θ(g(n))均为渐近非负,即当nnn足够大时, f(n)f(n)f(n)非负。【渐近非负性对于其他渐近符号也成立】
因为任意常量是一个0阶多项式, 随意可以把任意常量函数表示成Θ(n0)或Θ(1)\Theta(n^0)或\Theta(1)Θ(n0)或Θ(1)
[练习1.1]
1.1 假设f(n)与g(n)都是渐进非负函数, 使用Θ\ThetaΘ 记号的基本定义来证明 max(f(n),g(n))=Θ(f(n)+g(n))\max(f(n), g(n))= \Theta(f(n) +g(n)) max(f(n),g(n))=Θ(f(n)+g(n))
解: 根据定义,要使上述条件成立,只需存在正常数c1,c2,n0c_1, c_2, n_0c1,c2,n0, 使得对于所有的n≥n0n\ge n_0n≥n0:c1∗(f(n)+g(n))≤max(f(n),g(n))≤c2∗(f(n)+g(n))成立c_1*(f(n) + g(n)) \leq\max(f(n), g(n)) \leq c_2* (f(n) + g(n)) 成立c1∗(f(n)+g(n))≤max(f(n),g(n))≤c2∗(f(n)+g(n))成立
对于右边的不等号明显可知f(n)+g(n)f(n)+g(n)f(n)+g(n)恒大于其中之一,可取c1=1c_1=1c1=1
对于左边的不等号,由于f(n)和g(n)f(n)和g(n)f(n)和g(n)具有交换性(因其无明确定义),假设f(n)≤g(n)f(n)\leq g(n)f(n)≤g(n),则在c1=12c_1 = \frac{1}{2}c1=21时成立
则 对于c1=1,c2=12,n0∈Nc_1 = 1, c_2 = \frac{1}{2}, n_0 \in Nc