1.复杂度分析(上)

复杂度分析是整个算法学习的精髓
 
为什么需要复杂度分析?
 
算法执行效率评估:
事后统计法:
1.测试结果非常依赖测试环境
2.测试结果受数据规模影响很大
因此需要一个不用具体的测试数据来测试,就可以粗略估算算法执行效率的方法
 
大O复杂度表示法
 
每行代码>cpu>读数据-运算-写数据   :unit_time
所有代码的执行时间T(n)与每行代码的执行次数称正比

1
int cal(int n) { 2 int sum = 0; 3 int i = 1; 4 for (; i <= n; ++i) { 5 sum = sum + i; 6 } 7 return sum; 8 }
T(n) = O(2n+2) 

1
int cal(int n) { 2 int sum = 0; 3 int i = 1; 4 int j = 1; 5 for (; i <= n; ++i) { 6 j = 1; 7 for (; j <= n; ++j) { 8 sum = sum + i * j; 9 } 10 } 11 } 12
T(n) = O(2n**2+2n+3)
 
O(n),O(n**2)即为时间复杂度:表示一个算法执行效率与数据规模增长的变化趋势。
 
时间复杂度分析:
1.只关注循环执行次数最多的那一段代码
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
 
非多项式量级:O(2**n)和O(n!)
 
多项式量级:
1.O(1)
一般情况下,只要算法中不存在循环语句、递归语句,即使代码再多,时间复杂度也是O(1)
2.O(logn),O(nlogn)

1
i=1; 2 while (i <= n) { 3 i = i * 2; 4
3.O(m+n),O(m*n) 

1
void print(int n) { 2 int i = 0; 3 int[] a = new int[n]; 4 for (i; i <n; ++i) { 5 a[i] = i * i; 6 } 7 8 for (i = n-1; i >= 0; --i) { 9 print out a[i] 10 } 11 }

 
空间复杂度分析:表示算的存储空间与数据规模之间的关系 
 
1
void print(int n) { 2 int i = 0; 3 int[] a = new int[n]; 4 for (i; i <n; ++i) { 5 a[i] = i * i; 6 } 7 8 for (i = n-1; i >= 0; --i) { 9 print out a[i] 10 } 11 }

    空间复杂度为:O(n) 

 
posted @ 2019-03-01 21:39  夏天换上冬装  阅读(191)  评论(0编辑  收藏  举报