今天刷算法题又被时间复杂度卡住了?从哈士奇和女友吃饭带你理解时间复杂度!!!

1,536 阅读5分钟

哈士奇和对象约会常常边追剧边吃饭(小朋友千万别学习哈士奇的坏习惯!)今天哈士奇出门又双忘带平板电脑了!!于是回到寝室翻箱倒柜,从桌子到衣柜,从床下到床上,从百草园到三味书屋。谁知道好家伙一遍没找到,哈士奇又来了一遍,不知道过了多久,终于从一个不知名的角落找到了期待哈士奇已久的平板。转头看向手机,女友已经干完饭了。

说到这里,聪明的小伙伴是不是已经想到了什么不太对劲的地方?“这玩意和时间复杂度怎么这么像?”哈士奇找平板的时间复杂度是不是太大了点!!!那么哈士奇先给没有了解过时间复杂度的小伙伴过一过课本。

时间复杂度

时间复杂度又称作(算法的渐进时间复杂度)它通常是用来表示算法的时间量度,当进行算法分析时,语句的总的执行次数T(n)就是关于n的函数,表示T(n)会根据n的变化而进行改变。对于算法的时间复杂度来说 T(n)=O(f(n))。从这里就可以看出来,当n增大的时候(大家试试把无穷大带进去),算法的执行时间的增长率就会和f(n)的增长率相同。(大家是不是蒙了?哈士奇再给大家解释清楚)

f(n):基本语句重复执行的次数

T(n):语句的总执行次数

f(n)是T(n)的同数量级函数

O:代表正比例关系,即算法的重复执行次数执行时间正比,重复执行次数或者执行时间其中一个增加都会导致 O(f(n))或者说T(n)的增加!

从T(n)=O(f(n))中可以看出来f(n)与T(n)是正比例关系,但是因为在n的数量接近很大的时候最高次幂的那个n的函数就已经能近似代表算法的执行次数了,因此通常用O(f(n))表示算法的时间复杂度T(n)。

这里要敲黑板了!! 由于语句有很多条就是说f(n)可能为 2n+1,但是由于O加持,它就表示为O(n)

如果f(n)=n²+n 那么它由于O加持,它就表示为O(n²)

给大家举个例子

今天哈士奇找平板,从桌子到衣柜,从床下到床上,从百草园到三味书屋,一次就找到了哈士奇的平板,那么哈士奇找平板的时间复杂度就为O(1)

但是哈士奇突然感觉到一种指引,觉得平板就在桌子和衣柜中,结果找了n遍桌子和衣柜找到了平板,那么虽然从床下到床上,从百草园到三味书屋只找了一遍,但是因为前面找了n遍,哈士奇总时间还是近似于花费了n遍的时间,因此哈士奇找平板的复杂度就为O(n)

各位有没有从哈士奇的找平板经历中理解一丝丝时间复杂度嘞???

时间复杂度.常数阶

那么接下来这个简单的时间复杂度大家是不是就很容易写出来了

n++

显然它的代码执行了1次,时间复杂度为O(1) 它就是我们在时间复杂度相关表现形式中常说的常数阶,常数阶不管执行多少次,只要是可计算能预见的次数,那么它的时间复杂度就是O(1)

时间复杂度.线性阶

接下来我们就容易联想到,要是是无限大的次数呢或者说是未知的次数呢?

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

}

从这个代码中小伙伴可以知道这个代码就执行了n次,f(n)=n,T(n)=O(n)

它在我们的时间复杂度的相关表现形式中称为线性阶

时间复杂度.平方阶

那么当我写出下面的东西阁下将如何应对?

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

    }
}

显而易见,当j执行一次,i执行n次所以f(n)=n²,T(n)=O(n²)

它在我们的时间复杂度的相关表现形式中称为平方阶

它相当于哈士奇在找平板的过程中刚刚找了桌子,然后觉得桌子找的不仔细,又找了一下桌子,接着继续找书柜,重复了n遍以后又回到第一次的找完桌子以后找书柜,找了n遍(女友:哈士奇,你搁这套娃呢?是不是不想要对象了?)

时间复杂度.对数阶

既然老婆大人催了,那哈士奇肯定得加快脚步,抓紧找平板了!!假设哈士奇找一次平板以后就唤醒了尘封在大脑中的距离,那就能够逐渐记起忘记的平板位置

阁下还能好好看清楚哈士奇找平板的时间复杂度吗?

while(i<n)
{
    i=i*2
}

当i进行一次以后,i离目标n变为了以前的两倍,那么我们就知道2的i次幂就等于n那么实际上的时间复杂度就为log2(n) (怕小伙伴没看懂,就是2在log的右下方,n在2的右上方) 那么实际上f(n)=log2(n),T(n)=O(log2(n))

悄悄告诉大家一个小秘密!!!log和while更配哦,大家发现了while一定要多想想是不是对数阶的形式哦!!!

小结与联想

小结

今天哈士奇和小伙伴们分享了一下时间复杂度和常见的代码的几种表现形式,希望大家看到以后可以对时间复杂度有更深的理解。

联想

既然有时间复杂度,那肯定有空间复杂度嘛,时间不出,空间为王,那么空间复杂度到底是啥呢?欢迎大家多多想想哦!!哈士奇得去哄女友了。。。。。