算法学习随笔——3.算法分析原理(搜索问题优化)

这里主要记录的是算法学习过程中,值得学习和借鉴的解决问题思路。并不能解决某一特定的现实问题。用做启发和思考。

1.优化思维

在日常工作中,经常会遇到搜索问题。比方红外功能实现的遥控器键值表中,搜索特定键值、其中包括各种呈线性规则的数据表中搜索特定数据。

常规的方式就是遍历搜索

例1.

//a[N]表示某线性数据表
//val为所需查找的特定数据

int func1(int *p, int val)
{
    for(int i=0; i<N; i++)
    {
        if (val == p[i])
            return i;
    }
    return -1;
}

这样的时间复杂度为O(N),功能实现有两种情况,一种是找到数据并返回数据下标,另一种是找不到数据。当出现最坏的情况,和找不到数据的情况都需要遍历整个数组,循环操作N次。

但是如果将特定的线性数据按照顺序排列,那么我们程序的消耗时间就会降低。

例1.1二分法搜索

先对数据进行排序操作,对于很多工作中用到的数据表往往都是排好序的。排序的问题不在这里讨论,排序的算法放在后面讨论。使用二分法进行搜索,理论上N个数据只需要(N+1)/2次就可以实现搜索到目标数据。

//a[N]表示某线性数据表
//val为所需查找的特定数据

int func2(int *p, int val)
{
    int start=0, end=N;
    while(end >= start)
    {
        int mid = (start+end)/2;
        if (val == p[mid])
        {
            return mid;
        }

        if (val < p[mid])
        {
            end = mid-1;
        }
        else
        {
            start = mid+1;
        }
    }

    return -1;
}

例1和例1.1,我们可以从期望每个操作花费的时间去分析,得出我们优化的价值。当N的数值加倍时,例1顺序搜索的运行时间直接加倍,而二分搜索的运行时间是与lgN成正比,运行时间几乎没有改变,随着N的增长,这两种方法之间的差距越来越大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值