算法效率:空间换时间

问题:在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次,并且数组是一个无序的。设计一个算法,找出出现次数最多的数字。

算法效率的度量方法:

1.事后统计法:主要通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

  • 时间的比较依赖于计算机硬件和软件等环境因素
  • 算法的测试数据设计困难以及测试数据的规模也难以确定

2.事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。

算法的时间复杂度:就是算法的时间量度。

现在回归这道题目,我们要想找出数组中出现次数最多数字或者出现的次数,最简单的想法就是,先给数组排序,然后再看这个有序数组出现次数最多数字。

方法一:排序,然后找出出现次数最多数字。但是一旦排序,时间复杂度就至少为O(n^{2}),那么有没有其他的方法呢?

方法二:以空间换取时间

我们可以再开辟一块内存 sp[1000],当对无序数组遍历时,将每个数字出现的次数放在sp[1000]中,而且 sp 数组的下标就对应无序数组中的 数字 - 1,每当遍历到这个数字,那么 sp 数组中该数字对应下标里的数字就 加一。最后找出 sp 数组中的最大值即出现的次数。

代码1:

void search(int nums[], int len) // 将数组以及数组长度传入函数
{
    int sp[1000] = { 0 };
    int max = 0;
    
    for (int i = 0; i < len; i++)
    {
        int index = nums[i] - 1; // 把数字和下标绑定
        sp[index]++;             // 记录数字出现的次数
    }

    for (int i = 0; i < 1000; i++)
    {
        if(max < sp[i])          // 出现最多的数字为i+1
        {
            max = sp[i];         // 找出数字出现最多的次数 
        }
    }
}

代码2:

 

通过代码不难明白了以空间换取时间,自己开辟内存,来缓存一下结果,从而达到降低时间复杂度的目的。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

James_Tdr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值