算法是要讲效率的 ,而效率是指算法的执行时间 执行时间短当然是效率高 反之则低
那么如何来衡量算法的时间呢?
1:算法采用的策略 方案
2:编译产生的代码质量
3:问题的输入规模
4:机器执行指令的速度
比如1+2+...+100,
第一种:
int n = 100; //执行一次
int sum = 0; //执行一次
for(int i=1;i<n;i++){ 执行n+1次
sum+=I;//执行n次
}
第二种写法:
int n = 100; //执行一次
int sum = 0; //执行一次
sum=(1+n)*n/2; //执行一次
相比之下,第二种更简单,效率最高,而第一种做法还要循环,如果数据很大的话就循环更多了,消耗cpu的时间更长了.
第一种方案执行了1+1+(n+1)+n=2n+3次
第二种方案就执行了3次
现在讲下时间复杂度和空间复杂度的概念
时间复杂度:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况确定T(n)的数量级, 算法的时间复杂度,也就是算法时间的量度,几座T(n)=O(f(n)) 它表示随问题规模n的增大,算法执行时间的增长率和f(n)增长率相同,称作算法的渐近时间复杂度, 简称为时间复杂度,其中f(n)是问题规模n的某个函数
这样用大O()来体现算法时间复杂度的计法, 我们称之为大O记法
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法称之为最优算法
我们还是对从1加到100第二个方法就一行代码就计算出来, 不管n是多少,就一行代码解决问题,这是最好的算法.可以使用O(1)表示
推导大O算法
1:用常量1取代运行时间中的所有加法常数 这个就是常数阶
2:在修改后的运行次数函数中,只保留最高项 , 比如2n+1就是O(n) 这个是线性阶
3:如果最高项存在且不是1,就去除这个项相乘的常数 2*n^2+1 就是n^2 这个是平方阶 还有立方阶
4:对数阶 举个例子:
int i=1;
int n=100;
while (i<n){
i=i*2;
System.out.println("i="+i);
}
每循环一次都是在原来的基础上乘以2,从中我们可以得出2^x=n,利用我们高中的数学知识x=log(2)n,所以这个时间复杂度为
大O(logn),