大O表示法:
算法效率严重依赖于操作(Operation)数量
在判断时首先关注操作数量的最高次项
操作数量的估算可以作为时间复杂的估算
O(5) = O(1)
O(2n+1) = O(n)
O(n2+n+1) = O(n2)
O(3n3+1) = O(3n3) = O(n3)
习题:
前n项和的方法,实现了通过时间换取空间的效果(时间复杂度的度量).
#include<stdio.h>
int fun(int n) // O(1)
{
int ret = 0;
if(n>0)
ret = (1+n)*n/2; //通过一次执行完成
return ret;
}
void mian()
{
printf("%d",fun(5));
}
习题:
(典型的用空间来换取运算时间的案例,空间复杂度的度量)
在一个自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次.
设计一个算法,找出出现次数最多的数字.
int array[] = {1,3,3,3,5,6,6,7,3};
#include<stdio.h>
void search(int a[],int len)
{
int sp[1000] = {0};
int i=0;
int max=0;
for(i=0;i<len;i++) //遍历数组,求出每一个数字出现的次数,然后记录下来.
{
int index=a[i]-1; //就是把array[0]==1的这个"1" 通过 1-1=0放到sp[0]里面,再sp[index]++.
sp[index]++;
}
for(i=0;i<1000;i++) //扫描数组求出最大数.
{
if(max<sp[i])
{
max=sp[i];
}
}
for(i=0;i<1000;i++) //打印数字最多的.
{
if(max==sp[i])
{
printf("%d\n",i+1);
}
}
}
int main()
{
int array[] = {1,3,3,3,5,6,6,7,3};
search(array,sizeof(array)/sizeof(*array));
return 0;
//把每个数字出现的次数的中间结果,缓存下来:在缓存的结果中求最大值.
}