浅谈数据结构的算法复杂度

数据设计

算法设计的要求

1.正确性:
算法应满足具体的问题及需求
2.可读性:
算法应易于阅读和理解
3.健壮性:
输入数据非法时,算法也能适当作出放反应
4.高效性:
算法执行时间短,占用存储空间少

算法的时间复杂度

设问题的规模是n,把一个算法的时间耗费
T(n)称为该算法的时间复杂度
T(n)是问题规模n的函数

当n趋向无穷大的时候,T(n)与f(n)的比值是非零常数M,T(n)=O(f(n)),f(n)是语法中语句最大的频度
System.out。println(“Hello”);
常数级:O(1)

高斯求和:
public int sum(int n){
int sum=0; n = 100;
sum=(1+n)*n/2;
return sum;
}
常熟级:O(1)

public int sum (int n){
int i,sum=0;n=100; //执行2次
for(i=1;i<=n;i++){ //执行n+2次
sum=sum+i; //执行2n次
}
System.out.println(sum); //执行1次
}
线性级: O(n)

举例:求两个n×n数组的乘积
for(int =1;i<=;++){
for(j=1;j<=n;++j){
c[i] [j] =0;
for(k=1;k<=n;++k){
c[i] [j]+=a[i] [k]*b[k][j];
}
}
}

假设输入规模为n
(1)运算为常数级c,时间复杂度为O(1)
(2)运算量是输入规模的k倍,k为常数,时间复杂度O(n)
(3)运算量是n的平方级,时间复杂度为O(n²)
(4)运算量是k*n²,时间复杂度O(n²)
(5)运算量是O(n³),时间复杂度O(n³)

结论:O(1)<O(log2n)<O(nlog2n)<O(n²)<O(n³)<…<O(2的n次方)<O(n!)

降低算法复杂度的常用方法
(1)数学理论的方法
(2)用空间换时间

另一种衡量算法时间复杂度的方法: (计算时间)
(1)算法开始之前的时间点
(2)算法结束之后的时间点

long start = System.currentTimeMillis();
int n=0,sum=0;
while(n<100){
sum=sum+n;
n++;
}
long end =System.currentTimeMillis();
System.out.println(end-start);

延长执行时间
(1)扩大执行循环规模
(2)使用循环多次执行

若基本操作的执行次数与问题的输入数据有关,则可求算法的平均时间复杂度。

一般,当所有可能输入数据集出现概率均可知时,可求算法的平均时间复杂度,否则求算法在最坏的情况下的时间复杂度

空间复杂度是算法执行时所需的存储空间的量度,记作:S(n)=O(f(n)),其中n为问题的规模

分析算法空间复杂度时,一般只考虑执行算法所需辅助空间,若输入数据所占空间与算法本身有关,则也应计算在内

若算法执行所需空间与输入数据有关,则可求最坏情况下的空间复杂度

发布了12 篇原创文章 · 获赞 0 · 访问量 181

猜你喜欢

转载自blog.csdn.net/weixin_45722104/article/details/103979549