什么是好的算法?
1.满足正确性和健壮性。
2.根据算法编写出来的程序要有较高的效率,效率可以从 2 个方面衡量,即程序的运行时间 和 程序运行所需内存空间的大小。
程序的运行时间——时间复杂度
看一个算法所编程序运行时间的多少,用的并不是准确值,几秒或者几分什么的,而是用程序中语句总的执行次数间接表示程序的运行时间,而这个次数也不是精确到具体的几次,重在数量级。格式为:O(量级)
,常见复杂度大小为:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn) 。举个例子,分析一下 1+2+3+4 … +n =?
两种算法的时间复杂度
#include<stdio.h>
int main() {
//算法一:先算1+2=3,然后算3+3=6,然后继续...
int sum_1=0; //执行 1 次
for (int i = 1; i <= n; i++) { //执行 n+1 次
sum_1 = sum_1 + i; //执行 n 次
printf("%d\n", sum_1); //执行 n 次
}
// 一共执行 3n+2 次,重在量级,所以时间复杂性的量级为 O(n)
//算法二:等差数列求和公式:Sn=n (a1+an)/2
int sum_2 = 100000 * (1 + 100000) / 2; //执行 1 次
printf("%d\n",sum_2); //执行 1 次
// 一共执行 2 次,重在量级,所以时间复杂性的量级为 O(1)
}
所以,明显算法二的时间复杂度小,首选算法二。
程序运行所需内存空间——空间复杂度
这个相对于时间复杂度而言,并不是太重要,了解一下。具体了解可以看 时间复杂度和空间复杂度(详解版)
格式为:S(n) = O(f(n)),其中n为问题的规模大小。
练习题
-
下面程序段的时间复杂性的量级为(D)
for (i=1; i<=n; i++)
for (j=1; j<=i; j++)
for (k=1; k<=j; k++)
x=x+1;
A.O(1) B.O(n) C.O(n2) D.O(n3) -
下面程序段的时间复杂性的量级为(C)
for (int i=0; i<m; i++)
for (int j=1; j<=n; j++)
a[i][j]=i*j;
A.O(m3) B.O(n2) C.O(m * n) D.O(m+n)