什么是好的算法
-
空间复杂度 S ( n ) S(n) S(n)——根据算法写成的程序在执行时占用存储单元的长度。这个长度往往与输入数据的规模有关。空间复杂度过高的算法可能导致使用的内存超限,造成程序非正常中断。
-
时间复杂度 T ( n ) T(n) T(n)——根据算法写成的程序在执行时耗费时间的长度。这个长度往往也与输入数据的规模有关。时间复杂度过高的低效算法可能导致我们在有生之年都等不到这个结果。
例如:输入N,打印1~N:void printN(int N) { if(N) { printN(N - 1); printf("%d\n", N); } return; }
当N过大时,程序占用存储空间较大,非正常退出。改为循环结构实现:
void printN(int N) { int i; for(i = 1; i <= N; i++) { printf("%d\n", i); } return; }
没用涉及到程序调用的问题,不论N多大,占用的空间始终是固定的,没有问题。
另一个例子:求多项式的值:double f(int n, double a[], double x) { int i; double p = a[0]; for(i = 1; i <= n; i++) { p += (a[i] * pow(x, i)); } return p; }
每次循环执行i次乘法,乘法总次数 = ( 1 + 2 + . . . . . . . + n ) = ( n 2 + n ) / 2 =(1+2+.......+n)=(n^2+n)/2 =(1+2+.......+