a*算法的时间复杂度_四分钟掌握算法时间复杂度

b558c1bee4476027a967d96b1942b3ea.png

俗话说,时间复杂度和空间复杂度是衡量一个算法效率的两个重要指标,然而随着硬件存储技术的进步,存储空间开始用TB,PB,EB作为单位来衡量,空间复杂度似乎显得不再那么紧要。但是时间复杂度还是需要我们细细考量。

什么是时间复杂度? 在计算机科学中,算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间,记为 T(n) ,其中 n 是问题的规模,当n变化时,T(n) 也会随之变化。 如何表述时间复杂度? 实际情况中不运行程序,我们没有办法准确计算出算法的运行时间,所以T(n)的取值常用渐进时间复杂度来表示,渐进时间复杂度用大O符号来表示。 例如,如果一个算法对于任何大小为 n(必须比 n0 大)的输入,它至多需要 5n3 + 3n 的时间运行完毕,那么它的渐近时间复杂度是 O(n3),即T(n)=O(f(n))=O(n3),f(n)= 5n3 + 3n 称为频度函数,在计算时间复杂度的时候常用到此函数。 如何计算渐进时间复杂度O?

大 O 符号是由德国数论学家保罗·巴赫曼在其1892年的著作《解析数论》(Analytische Zahlentheorie)首先引入的。而这个记号则是在另一位德国数论学家艾德蒙·朗道的著作中才推广的,因此它有时又称为朗道符号(Landau symbols)。代表 order of ...(……阶)的大 O,最初是一个大写希腊字母 Ο(omicron),现今用的是大写拉丁字母 O。

举个例子,解决一个规模为 n 的问题所花费的时间(或者所需步骤的数目)可以表示为:

3585756a7476c3f2387c8e9ff16d8eb0.png

。当n增大时,n的平方项将开始占主导地位,而其他各项可以被忽略。举例说明:当n=500 时,4n是 2n 项的 1000 倍大,因此在大多数场合下,省略后者对表达式的值的影响将是可以忽略不计的。

同理,如果我们与任一其他级的表达式,例如:n比较,n的系数也是无关紧要的。

故大O有两条计算规则如下 1 假如 f(x) 是几项之和,那么只保留增长最快(通常是阶最高)的项,其他项省略。 2 假如 f(x) 是几项之积,那么常数系数省略。 大O与小o的区别?

在上例

3585756a7476c3f2387c8e9ff16d8eb0.png

根据以上两条计算规则,我们可以得出 T(n) ∈ O(f(n)) ∈ O(n2),或者 T(n) = O(f(n)) = O(n2)。

并且我们就说该算法具有 n阶(平方阶)的时间复杂度。

T(n)∈ O(n2) 代表的含义为 T(n) 的渐进增长性不快于 O(n2) ,有可能相等,可类别为 <=。

小 o 符号表示高阶的无穷小,即 T(n) 的渐进增长性严格慢于小 o(n2),即取不到等号,可类比为

下面的内容使用大 O 成立,而使用小 o 则不成立:

smiley_0.png x² ∈ O(x²)

smiley_0.png x² ∈ O(x² + x)

smiley_0.png x² ∈ O(200 * x²)

而下面的内容使用小 o 则成立:

f82b2f272a0390d2401a360f9ba7655f.png x² ∈ o(x³)

f82b2f272a0390d2401a360f9ba7655f.png x² ∈ o(x!)

f82b2f272a0390d2401a360f9ba7655f.png ln(x) ∈ o(x)

因此,如果 f(x)∈ 小o(g) 成立,那么 f(x)∈ 大O(g) 也一定成立,例如:x² ∈ 小o(x³),那么 x² ∈ 大O(x³) 也是正确的。


相同大小的不同输入值仍可能造成算法的运行时间不同,因此我们通常使用算法的最坏时间复杂度


常见时间复杂度计算    1.  执行时间不随问题规模 n 的变化而变化。

如下交换两个变量值的算法,

1int temp = i;
2i = j;
3j=temp;

此一类算法无论语句有多少条,其时间复杂度都是 O(1)。

2.循环主体中的变量参与循环条件的判断

例如:

1int i = 1;
2while(i<=n)
3i=i*2;

其中第三行循环主体中的变量 i 参与了 while 循环条件的判断,且每循环一次 i 变为原来的 2 倍,设执行次数为 t ,i 的值将变为 2 的 t 次方,则

aac1b71a60c75f91780a3f58854d6f11.png

取对数后即得

6b82094287b77a882c144bc795202760.png

6a89661e7b7e3b527f0075221ad136d5.png

常见的算法时间复杂度由小到大依次为:

Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

·end·

码农新观察

超乎想象的技术干货

7651ae40ff5ccd7c942e4e825b462e4f.png

微信号:码农新观察
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值