算法初探——大O表示法
2017-03-29 22:23
169 查看
1 #include <stdio.h> 2 #include<malloc.h> 3 int sum2(int n)//时间复杂度为常数,记为大欧--》O(1) 4 { 5 int sum = 0;//1 6 sum = (n +1)*n / 2;//2 7 return sum; 8 } 9 int sum1(int n)//n-> ∞时,时间复杂度O(n) 10 { 11 int sum = 0;//1 12 for (int i = 1; i <= n; i++) 13 sum += i;//n 14 return sum; 15 } 16 /* 17 算法测试求1到n的和 18 */ 19 int main(void) 20 { 21 printf("sum1=%d\n", sum1(100)); 22 printf("sum2=%d\n", sum2(100)); 23 return 0; 24 }
sum1所用指令步长明显比sum2多,sum2采用等差数列求和方式极大减少了运行时间。
我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。
“大O记法" :在这种描述中使用的基本参数是n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级(order),比如说“二分检索是O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法O ( f(n) )表示当n增大时,运行时间至多将以正比于f(n)的速度增长。
这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。
O(1)
int a=1;int b=1;int c=1;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
上面使用的是时间复杂的度量。类似时间复杂度,同样有空间复杂度。空间复杂度指程序需要开辟的存储空间。
如上代码:
1 #include <stdio.h> 2 #include<malloc.h> 3 int sum2(int n)//空间复杂度 4-》O(1) 4 { 5 int sum = 0;//4 6 sum = (n +1)*n / 2;//0 7 return sum; 8 } 9 int sum1(int n)//空间复杂度 8-》O(1) 10 { 11 int sum = 0;//4 12 for (int i = 1; i <= n; i++)//4 13 sum += i;//0 14 return sum; 15 }
相关文章推荐
- (译)算法之美(3)--大O表示法
- 大O表示法
- 2.1 数学基础、大O表示法、洛必达法则相对增长率、T(N) = O( f(N) )、Ω( g(N) )、Ω( h(N) )、o( p(N) )
- 大O表示法
- 算法概念:大O表示法/小o表示法/Ω/Θ
- 数据结构与算法(2)-大O表示法
- 大O表示法
- 算法初探——动态规划
- 【算法】二分查找法&大O表示法
- 网络分析优化Clique算法初探
- 算法初探——查找算法(顺序,折半)
- 大O表示法
- 算法初探——快速排序
- 【转july】二、Dijkstra 算法初探
- 算法初探——冒泡排序
- 大O表示法
- 算法初探——选择排序
- 大O表示法的算法复杂度列表
- 算法初探——插入排序
- 算法的时间复杂度(大O表示法)