秋秋在数据结构后,当然要紧接着开算法专栏了,但在这个系列的最初,我有以下几个问题:
何为算法?
算法分析是理论研究,是关于计算机程序性能和资源利用的研究。
在程序设计方面,什么比性能更重要?
特性,安全性,稳定性,用户友好性等等。
这一专栏的内容,我决定跟着麻省理工公开课的节奏走,这样大家也能找到视频源去跟着学习,或者在学习后把这个当作一个笔记进行复习。
好的,接下来我们进入算法的第一节
1.基础认知
(1)运行时间:
- 输入本身:如果输入有序,那么插入排序的工作就很轻松。
- 输入规模:不同的数量,运行时间有很大的区别,并且我们将运行时间看作待排序数据规模的函数。
- 运行时间的界限:我们需要确保运行时间是有一个明确的下限,这是对用户的承诺。
- 在程序分析时,我们可以不考虑常数的时间,但是在编写代码时,我们需要注意常数时间。
(2)算法分析:
- 最坏情况分析:这里定义T(N)为输入规模为N时的最长运行时间。
- 平均时间分析:此时T(N)为输入规模为N时的期望时间;
我们需要假设一个有关输入的统计概率分布,通常都是假设它们是等可能的出现。 - 最好情况分析:更多人愿意把这个分析称之为bogus(假象),它更像是一种欺骗。
(3)算法的大局观- 渐进分析
- 定义:忽略依赖于机器的常量,无视实际的运行时间,关注运行时间的增长。
- 意义:满足了人们对于相对速度和绝对速度的需求。
- 渐进符号:
Θ:对于一个公式,舍弃其低阶项,忽略常数因子。
2.渐进符号的详解
(1)基本符号
O函数
- f(N)= O(g(N)): 对于充分大的N而言,表示存在适当的常数,使得f(N)小于或等于cg(N).
- 2 * N^2 = O(N^3),等号是可以不对等的。
- O的精妙用法:
当作一个宏,例如f(N)=n3+O(N2),这样可以描述误差,f(N)=n^3+h(N).
当然还有:n2+O(N)=O(N2),描述为N^2+f(N)=h(N).
Ω函数
- Ω(g(N))=f(N): 对于充分大的N而言,表示存在适当的常数,使得f(N)大于等于cg(N).
- theta(g(N)) 是 O(g(N)) 与 Ω(g(N)) 的交集。
(2)严格符号
- o和ω相对于O和Ω来说,更精确,指再前面的基础上将适当的常数修改为任意的常数。
- 2N^2 = o(N^3).
3.解递归式
有三种方法解递归式:代换法、递归树法、主方法
(1)代换法的步骤:
- 猜答案,当然不需要完全准确,只需要个形式就ok
- 验证是否正确
- 找出系数
插入一点,你不能用O和Ω做递归的归纳,因为基本符号里面的常数是变化的,动态的,不能对常数进行n次的加倍。
- 例如:T(N)=4T(N/2)+N
- 假设:
T(N)=O(N^3) - 验证:
T(N) <= ck^3
T(N) = 4T(N/2)+N <= 4c(N/2)^3+N = cN^3/2 + N = O(N^3).
当然这指表示上式是对的,而不是最优解。 - 当然你也可以自己验证O(N^2),当然你会发现用上述的方法只能证明出来这不成立。
- 但是让T(N)=4T(c1(N/2)-c2(N/2))+N,这样就证明出来了。
- 那么T(1)<=c1-c2,对于c2而言,c1是足够大的。
(2)递归树法的步骤
- 求叶节点数目
- 对树的每一层进行求和
- 例如:T(N)=T(N/4)+T(N/2)+N^2.
- 求解:
第一层为:N^2
第二层为:5/16 * N^2
第三层为:25/256 * N^2
第N层为:5k/16k * N^2
求和:T(N) <= (1+5/16+···+5k/16k+···) < 2N^2 = O(N^2)
(3)主方法(但是其限制较多,只能应用几种特殊的递归方法):
- 其形式如下:T(N) = aT(N/b) + f(N),其中a>=1,b>1,f(N)渐进趋正
渐进趋正:有合适的n0,使得当n>n0时,f(n)>0
- 比较f(N)与N^logb(a),其中b是底
- N^logb(a)是递归树叶节点的数量
- case1:f(N)=O(N^(logb(a)-ε)),ε>0.
即N^(logb(a))的次方大于f(N)的次方
结果:T(N)=Θ(N^logb(a)) - case2:f(N)=Θ(N^(logb(a) * lg(N)^k)),k>=0.
即N^(logb(a))与f(N)是同一次方
结果:T(N)=Θ(N^logb(a) * lg(N)^(k+1)) - case3:f(N)=Ω(N^(logb(a)-ε)) ,ε>0. && af(N/b)<=(1-ε’)f(N) ,ε’>0,f(N)要大于下一层之和,那么下一层之多等于(1-ε)f(N).
即N^(logb(a))的次方小于f(N)的次方
结果:T(N)=Θ(f(N))
- 在这里要感谢麻省理工的公开课,当然也要感谢努力的自己和支持的你们