算法讲解第一期:浅谈时间复杂度

一.时间复杂度的定义和重要性

李开复在《算法的力量》一文中写道:

\(1988\)年,贝尔实验室副总裁亲自来访问我的学校,目的就是想了解为什么他们的语音识别系统比我开发的慢几十倍,而且在扩大至大词汇系统后速度差异更有几百倍之多......在与他们探讨的过程中,我惊讶地发现一个\(O(nm)\)的动态规划居然被他们做成了\(O({n}^{2}m)\)......

上文提到的\(O(nm)\)\(O({n}^{2}m)\)就是时间复杂度。符号\(O\)表示复杂度,里面的\(mn\)可以认为运行次数是\(m*n\)
时间复杂度的意义就在于能有合理的时间效率
在上一个例子中,如果李开复的系统运行时间是\(10\)秒,n=\(1000\),那么贝尔的程序需要\(10000\)秒。这是一个惊人的数字。

有人问我:那不是有超算(超级计算机)吗,人家神威·太湖之光每秒能运行\({10}^{17}\)次呢!
我回答:再厉害的超算也扛不住大数据啊!

普通计算机大概每秒\({10}^{7}\)次,前者是后者的\({10}^{10}\)倍。
但比如是查找,线段树的时间复杂度是\(O(\log{n})\),顺序查找则是\(O(n)\)
\(n\)是数据规模;
对全校进行普查,\(n=3000\),前者\(4\)次,后者\(3000\)次;
对全市进行普查,\(n=2*{10}^{7}\),前者\(8\)次,后者\(2*{10}^{7}\)次;
对全国进行普查,\(n=1.3*{10}^{9}\),前者\(10\)次,后者\(1.3*{10}^{9}\)次。

到世界级,如果不注意算法,超算的运行时间可能还比普通计算机慢......

可见算法选择的重要

二.亲身感受时间复杂度

大家可以通过写代码来看一看。

原样输入输出数组,时间复杂度为\(O(2n)\)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    return 0;
}
{
    
}

猜你喜欢

转载自www.cnblogs.com/SuperTer/p/algorithm-1.html
今日推荐