算法及时间/空间复杂度的分析

算法(Algorithm)

对特定问题求解步骤的一种描述,是为解决一个或一类问题给出的一个确定的、有限长的操作序列

算法的基本特征

①输入:有零个或多个输入
②输出:有一个或多个输出
③有穷性:在执行有穷步之后结束,且每一步都在有穷时间内完成
④确定性:算法中的每一条指令必须有确切的含义,对于相同的输入只能得到相同的输出
⑥可行性:算法描述的操作可以通过已经实现的基本操作执行有限次完成

有效算法五大特征

①正确性:能满足具体问题的需求,对于任何合法的输入,算法都会得出正确的结果
②健壮性:对非法输入的抵抗能力,即对于错误的输入,算法应能识别并做出相应处理,而不是产生错误结果或陷入瘫痪
③可读性:容易理解和实现
④时间效率高:运行时间短
⑤空间效率高:占用的存储空间尽量少

算法的描述方法(以欧几里得算法为例)

①自然语言
在这里插入图片描述
②程序流程图
在这里插入图片描述

③伪代码
在这里插入图片描述

④程序设计语言
在这里插入图片描述

时间复杂度

渐进复杂度分析

①算法的运行时间是问题规模n的函数,记作T(n)
②用基本语句的执行次数表示T(n)
③忽略低阶项和常系数,只考虑最高阶
④用大O、大Ω和大Θ表示其渐近意义下的阶

分析算法时间复杂度的一般步骤

在这里插入图片描述

渐进上界(O)

如果存在两个正的常数c和n0
对于任意n≥n0,都有f(n)≤c×g(n),则称f(n)=O(g(n)),即g(n)为f(n)的上界
在这里插入图片描述
一个算法的运行时间用大O符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑上界”或“紧确上界”
一般地,如果f(n)=amnm+am-1nm-1+…+a1n+a0,有f(n)=O(nm)

渐进下界(Ω)

若存在两个正的常数c 和n0
对于任意n≥n0,都有f(n)≥c×g(n),则称f(n)=Ω(g(n)),即g(n)为f(n)的下界
在这里插入图片描述
一个算法的运行时间用大Ω符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑下界”或“紧确下界”
一般地,如果f(n)=amnm+am-1nm-1+…+a1n+a0,有f(n)=Ω(nm)

渐进紧界(Θ)

若存在三个正的常数c1、c2和n0
对于任意n≥n0都有c1×g(n)≥f(n)≥c2×g(n),则称f(n)=(g(n)),即g(n)与f(n)同阶
在这里插入图片描述
f(n)=Θ(g(n)),当且仅当f(n)=O(g(n)),f(n)=Ω(g(n))
一般地,如果f(n)=amnm+am-1nm-1+…+a1n+a0,有f(n)=Θ(nm)

常见复杂度的大小
类型顺序
多项式阶算法(有效算法)T(n)=O(nk)
常见的多项式阶大小排序O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)
指数阶算法T(n)= Ω(an),a>1
常见的指数阶大小排序O(2n)<O(n!)<O(nn)

如图:
在这里插入图片描述
运行时间表:
在这里插入图片描述

渐进时间复杂度分析的一般步骤

①决定用哪个或哪些参数作为算法规模问题的度量
②找出算法中的基本语句(循环体)
③检查基本语句的执行次数是否依赖于其它影响(如排序问题中原序,可分为最好、最坏和平均)
④建立基本语句执行次数的求和表达式
⑤使用渐进符号O表示算法增长率的上限

Ps:通常只求最坏情况运行时间,因为
给出了任何输入的运行时间的上界;对某些算法,最坏情况经常出现;“平均情况”往往与最坏情况一样差

空间复杂度

一个算法的存储量包括形参所占空间和临时变量所占空间。在对算法进行存储空间分析时,只考察临时变量所占空间

渐进空间复杂度

同时间复杂度,S(n) = O(n)、Ω(n)、Θ(n)

原地工作

如果算法所需的辅助空间相对于问题的输入规模来说是一个常数,我们称此算法为原地(或就地)工作,即S(n) = O(1)

递归

对于递归函数的,需要空间(栈)来存储每一层的数据,因此空间复杂度并不为O(1)


递归方程及其求解方法

递归方程

①递归方程是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数
②当一个算法包含对其自身的递归调用时,可以用递归方程来表示其运行时间

1)、迭代法

从初始递归方程开始,反复用递归方程右边的等式代入左边的函数,直到得到初值
例,求解:
T(n) = O(1) 当n=1时
T(n) = 2T(n/2)+ O(n) 当n>1时
在这里插入图片描述

2)、代入法

①猜测解的形式
②用数学归纳法进行验证

3)、递归树法

以树的形式来展开一个递归算法的模型:
递归树是一棵结点带权值的树,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用

①递归树的构造
初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点
②递归树的求解
将树中每层中的代价求和,得到每层代价,再将所有层的代价求和,得到总的递归调用代价

例,求解:T(n)=2T(n/2)+O(n)
在这里插入图片描述对于不平衡的递归树:T(n)=T(n/3)+T(2n/3)+n
在这里插入图片描述
设从根结点到最长路径的层数为:k
则n*(2/3)k = 1,解得 k = log3/2n
得出时间复杂度为:
在这里插入图片描述

4)、主方法

适用于求解:
T(n)=aT(n/b)+f(n) a≥1,b>1为常数,f(n)为渐近正函数

对原始方程进行解析:
在这里插入图片描述

分为三种情况
在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值