算法初探——大O表示法

时间:2021-09-05 10:35:00
 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 }