(算法是你的谎言)一、基本与解递归树

秋秋在数据结构后,当然要紧接着开算法专栏了,但在这个系列的最初,我有以下几个问题:
何为算法?
算法分析是理论研究,是关于计算机程序性能和资源利用的研究。
在程序设计方面,什么比性能更重要?
特性,安全性,稳定性,用户友好性等等。


这一专栏的内容,我决定跟着麻省理工公开课的节奏走,这样大家也能找到视频源去跟着学习,或者在学习后把这个当作一个笔记进行复习。
好的,接下来我们进入算法的第一节


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))

  • 在这里要感谢麻省理工的公开课,当然也要感谢努力的自己和支持的你们
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值