时间复杂度

Posted hydcn666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间复杂度相关的知识,希望对你有一定的参考价值。

间复杂度的含义

它定性描述该算法的运行时间(度娘原话)

翻译成人话,就是程序的运行时间

时间复杂度的作用

举个栗子

几百年前,高斯巨佬还在上小学。一天,课堂乱哄哄的,老师灵机一动(脑子抽筋),布置了一道计算题——1+2+…+100=?

一般人都暴力计算,老师也不例外,1+2=3,3+3=6...4950+100=5050

假设这是一个程序,其时间复杂度为O(N)

 

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

 

 

而高斯却不同寻常,马上得出了结果

Sum =    1+...+100

Sum =100+...+    1

2Sum=101*100

Sum=5050

假设这是一个程序,其时间复杂度为O(1)

 

sum=(1+n)*n/2;

 

假如你是正常人,你肯定会采用后者

因为,后者更快

程序也是如此,算的辣么慢,还要程序员有何用

技术图片

很大程度上,时间复杂度决定了算法的优劣

判断时间复杂度

看懂了时间复杂度,还要去掌握

O(1)

sum+=1;
/*即使语句再多,固定运行次数的都算O(1)*/

O(n)

 

for (int i=1;i<=n;i++){}

 

O(n^2)

 

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

 

O(log n)

 

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

 

O(2^n)

/*双重选择的递归*/

 

那么,一个程序的时间复杂度就是所有部分时间复杂度总和吗?

并不是

通常,我们只保留最高阶项,且舍弃系数

接下来,就该比较一下了

O(1)<O(log n)<O(n)<O(n log n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)

在大部分OJ中,限时为1S

O(1),O(log n),O(n),O(n log n)绝对不超时

在许多情况下,O(n^2)是最优方法,也会通过

毕竟很多算法时间复杂度就是O(n^2)

O(n^3)偶尔也能通过

O(2^n),O(n!),O(n^n)想都别想,绝对TLE

小结

这种能力无需特别培养,只要多刷题,多动动脑子,吃枣会自己理解

 

 

以上是关于时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

基于时间复杂度的这些片段真的很困惑

用于数据加载的 Android 活动/片段职责

PAT 乙级 1049 数列的片段和

PAT1049-----枚举法,找规律题,注意降低时间复杂度