最近期中考,人家是在复习,而我则是在预习,真惭愧~~
关于时间复杂度的问题纠结了很久很久,也是半懂不懂的,然后打算写篇博客来记录一下自己看书后的收获,也在这里记录一下关于时间复杂度的认识,说的不好或是不对的地方,请原谅。
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
一般情况下,算法中的基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作
T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。
很简单的一个例子:
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
c[i][j]=0;
for(k=0;k<n;k++)
c[i][j]+=a[i][k]*b[k][j];
}
上面的这个例子是“矩阵相乘问题”的基本操作。整个算法的执行时间与该操作重复执行的次数n3成正比,所以时间复杂度为T(n)=O(n3);在这里我粗略的把计算机1秒运行的次数看作108(具体的怎么说我也不知道,水平太辣鸡)。比如题目规定的时间为1秒,当n=1000时,时间复杂度为10,和计算机1秒运行次数进行比较得出时间超限……。
算法还可能呈现的时间复杂度有对数阶O(log n)(例如:二分查找,还有分治乘方运算也是也是对数阶)、指数阶O(2n)等。一般情况下,对于问题(或一类算法)只需要一种基本操作来讨论算法的时间复杂度即可,当然有时也需要同时考虑几种基本的操作,甚至可以对不同的操作赋予不用的权值,以反映不同操作所需要的相对时间,这种做法便于综合比较解决同一问题的两种完全不同的算法。