提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
时间复杂度(详细)
概念
时间复杂度Time complexity
• 根据算法写成的程序在执行时耗费时间的长度。
• 时间复杂度过高的低效算法可能导致我们在有生之年都等不到运行结果。
• 算法中基本语句重复的执行次数是问题规模n的函数,记为f(n)。
• 随问题规模n的增大,算法执行时间的增长率和函数f(n)的增长率
相同,即T(n)与f(n)数量级 (Order of Magnitude)相同T(n)=O(f(n)),
T(n) 为算法的渐近时间复杂度,简称时间复杂度。
公式
语句执行时间=语句重复执行次数*执行一次所需时间(单位时间)
时间复杂度T(n)按数量级递增顺序为:
步骤
• 1.找出语句频度最大的语句作为基本语句
• 2.计算基本语句的频度得到问题规模n 的某个函数f(n),即执行次数
• 3.取其数量级用符号“O”表示
示例
int a=0,b;
a++;
b=9;
System.out.println(a+b);
语句频度为1, T(n)= O(1);
for (int a=0;a<n;a++){ //单层循环语句频度为n
for (int b=0;b<n;b++){ //嵌套循环语句频度为单层循环语句频度之积
count++;
}
}
语句频度为n*n,T(n)=O(n^2);
for (int a=0;a<n;a++){
for (int b=0;b<a;b++){ //注意与上一个示例的区别,这里b<a
count++;
}
}
推导:
b < a = 1, 2, 3, … ,n
f(n) = 1+2+3+…+n=n*(n+1)/2,即 T(n) = O(f(n)) = O(n^2)。
所以,语句频度为近似于 n^2,T(n)= O(n^2)。
int s=0,i=0;
while(s <( 5*n*n + 2)) {
i++;
s+=i;
}
推导:
设循环体内语句频度 f(n)=x ,则 0+1+2+ … +x = x*(x+1)/2 < 5n^2+2 ,可解得
T(n) = O(f(n)) = n,语句频度近似于n。
for (int i=1;i<=n;i*=2){
s++;
}
推导:
设循环体内语句频度为 f(n),2^f(n) <= n,可得
for (int i=1;i<=n;i*=2){ //外层循环语句频度为log2(n)
for (int j=0;j<n;j++){ //内层循环语句频度为n
s++;
}
}
语句频度为
空间复杂度(简略)
• 算法的空间复杂度是指解决问题的算法在执行时所占用的存储空
间,记作S(n)。
• 即存储空间、变量占用空间、系统堆栈的使用空间等等。通常空
间复杂度的度量分为两个部分:固定部分和可变部分。
• 若所用额外存储空间相对于问题规模n来说是常数,则称此算法
为原地(就地)工作。
详细博客(他人)链接
http://t.csdn.cn/V28cU(个人认为非常好的)