时间复杂度
顾名思义,时间复杂度就是评估一个算法的时间开销。
直觉上想一想可以用什么样的思路来评估算法的时间开销?
首先可以想到的是直接让算法跑一遍,看看它用多久的时间。
但是这样的方法存在一些问题:
1、和机器性能有关,比如单片机和超级计算机的对比。一个垃圾算法,超级计算机也很快给你跑出来了,而另一边的好算法也还没跑出来。
2、和编程语言有关,越高级的编程语言执行效率越低。例如同一个算法,Java肯定比c语言慢。
3、和编译程序产生的机器指令质量有关。
4、有些具有破坏性和损耗性的算法无法通过运行后再测试。例如,控制导弹发射的算法,不可能等它发射后,再讨论这个算法的优劣,那样就毫无意义了。
所以我们就设想有没有一种方法,能够排除与算法本身无关的外界因素,直接评价它所需要用的时间?
算法时间复杂度因此而生。
事先预估算法时间开销T(n)与问题规模n的关系(T表示“time”)。
以下代码段:
void Hello(int n) //n为问题规模
{
int i=1; //打招呼的次数
while(i<=n)
{
i++; //每次加一
printf("Hello %d\n",i);
}
printf("Hello more than %d\n",n);
}
int main()
{
Hello(3000);
}
语句频段:
int i=1; ——执行1次
while(i<=n); ——执行3001次
i++;