渐进表达式求解 算法_一文学会算法复杂度分析,面试再也不用愁了

本文介绍了算法复杂度的概念,包括时间复杂度的定义、比较算法效率的方法以及渐进分析。通过上界符号O、下界符号Ω和紧渐进符号Θ等来近似计算算法的时间性能。文章还提供了计算时间复杂度的具体步骤,并通过案例分析了如何求解不同结构循环的时间复杂度,如嵌套循环和平行循环。最后,作者承诺将分享更多关于算法复杂度在实际问题中的应用。
摘要由CSDN通过智能技术生成

1什么是算法复杂度

身为程序员的我们都知道程序=数据结构+算法 算法=逻辑+控制。当我们要解决一个问题的时候,必然会经过以下几个步骤

问题的理解

数据结构设计

算法设计

算法分析

程序实现与测试

所谓时间复杂度就是衡量一个算法效率的手段

2如何比较算法的效率呢?

也就是比较算法的所用时间,但是一个算法所需要的时间和一下3个因素有关,规模 输入 算法本身,举一个例子:现在需要把1-10的乱序扑克牌从小到大排列。

10就是规模 ,输入就是乱序1-10的数字,算法就是看采取什么样的排序算法,就是上面说的算法设计。

抛开软件因素和硬件因素,算法是由一组语句构成,一个算法的效率就是一个语句执行了多少次,次数越少时间越少,算法效率更高。所以一个算法的基本操作次数和规模有一定的函数关系,这里算法的时间复杂度表达式为

3eaa1f3239c366177811bf2d01d96c79.png

3渐进分析

我们计算时间复杂度并不是要一个准确的值,而是一个相对近似的计算,大概知道所耗费的时间就行,所以就得用到渐进分析。

上界符号O

就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都不会大于g(n)。

图像表示如下:

eead0d6f2f42c1fe3019e263c8d9aea2.png

下界符号Ω

这个刚好和上一个概念相反,上一个理解了这个也就理解了,

就是存在一个常数n0,n0以后的时间复杂度函数值f(n)都大于等于g(n)。

也就是上图最右侧部分。

紧渐进符号Θ

这个也很好理解,就是时间复杂度函数值f(n)的值在两个函数之间,也就是上图最左侧部分。

非紧上界封号o

这种情况就是(上界符号O)的情况去掉等于的情况。

非紧下界封号w

这种情况就是(下界符号Ω)的情况去掉等于的情况。

于是我们就可以这样近似记忆

e7548d93274e4ff4e3e3add7c69def4e.png

在渐进分析的基础之上,我们会经常遇到以下几种情况。

988eb350a4d958e466c8fe204af57f18.png

绘制成图像就是这样。

c86bea7efff8039a8dcfc9a22f7e7593.png

我们在分析时间复杂度的时候,都是找出循环次数最多的语句。计算出相关表达式,常用的表达式有以下几种。

ac65363022e1e072795b553cb5a6410e.png

了解了上面的东西我们来解释如何利用上面的知识进行计算。

求解算法的时间复杂度的具体步骤是:

  ⑴ 找出算法中的基本语句;

  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  ⑵ 计算基本语句的执行次数的数量级;

  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

  ⑶ 用大Ο记号表示算法的时间性能。

  将基本语句执行次数的数量级放入大Ο记号中。

  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如:

案例1

  for (i=1; i<=n; i++)

   x++;

  for (i=1; i<=n; i++)

   for (j=1; j<=n; j++)

   x++;

 第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。

案例2

for (i=1;i

{

y=y+1; ①

for (j=0;j<=(2*n);j++)

x++; ②

}

解: 语句1的频度是n-1
语句2的频度是(n-1)*(2n+1)=2n2-n-1
f(n)=2n2-n-1+(n-1)=2n2-2;

Θ(2n2-2)=n2

Θ即:去低阶项,去掉常数项,去掉高阶项的常参得到

时间复杂度T(n)=O(n2).

再来看一个比较常见的log相关的

i=1; ①

while (i<=n)

i=i*2; ②

解: 语句1的频度是1,
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)=log2n,
T(n)=O(log2n )

以上就是算法的时间复杂度了,面试的时候就不用担心被问这个问题了,以后的文章我会分析leetcode等相关算法,每个题目分析时间复杂度,也就相当于是对知识的应用了。

持续分享编程数据结构与算法相关知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值