空间换取时间的案例

大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;
    //把每个数字出现的次数的中间结果,缓存下来:在缓存的结果中求最大值.
}

猜你喜欢

转载自blog.csdn.net/superman___007/article/details/81154979