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)