一、背景
多数情况下,算法执行时所用的时间更令人关注,如果有必要,可以通过增加空间复杂度来降低时间复杂度。同理,也可以通过增加时间复杂度来降低空间复杂度。在实现算法时,需要分析具体问题对执行时间和空间的要求。
二、空间换时间
- 源代码
#include <stdio.h> /* 问题: 在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。 设计一个算法,找出出现次数最多的数字。 */ void search(int a[], int len) // n+2003 ==>O(n+2003) = O(n) { int sp[1000] = {0}; //1 int i = 0; //1 int max = 0; //1 for(i=0; i<len; i++) //n { int index = a[i] - 1; sp[index]++; } for(i=0; i<1000; i++) //1000 { if( max < sp[i] ) { max = sp[i]; } } for(i=0; i<1000; i++) //1000 { if( max == sp[i] ) { printf("%d\n", i+1); } } } int main() { int array[] = {1, 1, 3, 4, 5, 6, 6, 6, 2, 3}; search(array, sizeof(array)/sizeof(*array)); return 0; }
- 分析
此方法的算法复杂度是O(n),一般情况下会采用先排序的方法,接着再去依次遍历数组统计各个元素的个数,显然这样子的做法的算法复杂度比上述方法高。下图是各种排序算法的复杂度: