程序在计算机上的运行时间取决于下列因素:
1.算法采用的策略、方案
2.代码质量
3.输入规模
4.机器执行指令的速度
我们看下等差数列求和的两种算法的执行情况
第一种算法:
int sum = 0; //执行1次 int n = 100; //执行1次
for (int i = 1; i <= n; i++) { //执行n+1次
sum = sum + i; //执行n次
}
System.out.println(sum); //执行1次
第二种算法:
int n = 100; //执行1次 sum = (1 + n) * n / 2; //执行1次
System.out.println(sum); //执行1次
第一种算法执行了2n+4次,第二种算法执行了3次
当输入规模很大的时候,也就是n值很大的时候,两种算法的执行效率就可以看成n:1
int x = 0; int sum = 0;
int n = 100;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
x++;
sum = sum + x;
}
}
这个算法的执行次数呢?有一个嵌套的for循环,输入规模很大的时候可以抽象为n²
算法效率的度量方法
算法的时间复杂度
在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。
算法的时间复杂度,也就是算法的时间量度,记作:T(n)=O(F(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。这种记法称作大O标记法
一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
以上三个算法的时间复杂度分别是O(1),O(n),O(n²)
时间复杂度(大O记法)的推导原则:
用常数1取代运行时间中的所有加法常数。
在修改后的函数中,只保留最高项。
如果最高阶项存在且不是1,则去除与这个项相乘的常数。
算法的空间复杂度
也就是算法所需的内存空间,记作:S(n)=O(F(n))。其中,n为问题规模,f(n)为关于n所占存储空间的函数。