时间复杂度

时间:2019-11-16
本文章向大家介绍时间复杂度,主要包括时间复杂度使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

间复杂度的含义

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

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

时间复杂度的作用

举个栗子

几百年前,高斯巨佬还在上小学。一天,课堂乱哄哄的,老师灵机一动(脑子抽筋),布置了一道计算题——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

小结

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

原文地址:https://www.cnblogs.com/HYDcn666/p/o_n.html