算法时间复杂度的定义:在进行算法分析使,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n 的变化请款并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(f(n))。他表示随问i中题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的监禁时间复杂度,简称为时间复杂度,关键知道执行次数=时间;
我们三个求和算法的时间复杂度分别为O(1),O(n),O(n^2),
如何分析一个算法的时间复杂度呢?
1.用常数1取代运行时间中的所有加法常数;
2在修改后的运行次数中,只保留最高项;
3如果最高阶存在且不是1,则去除与这个项目乘的常数;
4得到的最后救过就是大O阶;
线性阶;O(n)
int i,n=100,sum=0;
for(i=0;i<100;i++)
{
sum=sum+i;
}
平方阶——O(n^2)
嵌套两个循环
int i,j,n=100;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<"I love you fish.com"<<endl;
}
}
由上面很容易得出:循环的时间复杂度就等于循环体的复杂度乘以该循环运行的次数
对数阶:O(logn)
2^x=n得到x=log(2)n,所以得到的时间复杂度就为O(log(n));
看下面一个例子,分析时间复杂度:
n++; //1
function(n); //n^2
for(i=0;i<n;i++) //n^2
{
function(i);
}
for(i=0;i<n;i++){ //n^2
for(j=i;j<n;j++)
{
cout<<j<<endl;
}
}
根据上面的步骤,将每一次相加取最高阶,去掉常数项,得O(n^2)
还有其他常见的时间复杂度:”
O(nlog(n))、O(n^3)、O(2^n)
最后总结一下常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
算法的空间复杂度
比如我们在写代码时,完全可以用空间来换去时间,举个栗子:要判断某年是不是闰年,你可能会花一点心思来写一个算法,每给一个年份,就可以通过这个算法计算得到是否是闰年的结果。
但是另外一种方法是,事先建一个有2050个元素的数组,然后把所有的年份按下标的数字对应,如果是闰年,则数组元素的值
是1,如果不是闰年,则元素的值为0.这样所谓的判断一年是否为闰年就变成了查找这个数组某一个元素的值是否为1 的问题。;
这样看来,第二种算法每次查询只需要一次索引判断即可。
算法的空间复杂度通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n))。其中
n为问题的规模,f(n)为语句关于n所占存储空间的函数。