从一个简单查找问题看算法的魅力

问题描述

有一个大小为m的整形数组,数组是从小到大有序的,现在要求给定一个数,在数组中查找,如果找到,给出下标,否则返回-1。

两种解决思路

顺序查找

顺序查找的思路很简单,我们从第一个元素开始比较,如果目标值等于当前的值,此时结束程序。如果目标值小于当前值,由于数组是排序的,后面的元素都比当前大,所以后面的元素不可能出现目标值,此时结束程序。如果查找整个数组还没有找到,结束程序。
c语言代码如下:

 int line_search(const int array[], int size, int key) {
    int i = 0;

    for (/* empty */; i < size; i++) {
        if (key <= array[i]) {
            break;
        }
    }
    if (key < array[i] || i == size) {
        return -1;
    } else {
        return i;
    }
}
二分查找

二分查找就是首先把目标值与整个数组的中间的值相比较,如果找到就直接返回;如果目标值比中间的值大,说明目标值在数组后半部分,我们就抛弃前半部分;相反,我们抛弃后半部分,查找前半部分。然后继续从剩下的部分的一半继续比较。就这样不断的二分下去,直到找到或者不可二分后还没找到,结束程序。
c语言程序如下:

int binary_search(const int array[], int low, int high, int key) {
    int middle = 0;
    while (low <= high) {  //当low == high时,还有一次比较
        middle = (low + high) / 2;//二分
        if (array[middle] == key) {
            return middle;
        } else if (array[middle] < key) {
            low = middle + 1;//比较后半部份
        } else {
            high = middle - 1;//比较前半部分
        }
    }
    return -1;
}

两种算法分析

两种算法的最好情况都是第一次比较就是要查找的元素,这时的时间复杂度为1。
对于顺序查找,他的最坏情况会遍历整个数组,这样的时间复杂度为m。
对于二分查找,m个元素可以进行的二分次数k我们可以算出: m/2k=1 。算出来k的值为: log2m +1
m=1020 时,假设电脑每秒比较 109 次,顺序查找最坏需要 1011 秒,而二分查找只需要大约 80109 秒,由此可以看出两种算法都能得到结果,但是当数据量太大,两种算法所花的时间差距很大。
通过精心的设计程序,能够大幅度的降低运算时间,这就是算法的意义所在。

总结

关于算法的研究已经有几千年的历史了,学习算法能够让我们体验到用计算机解决实际问题的那种成就感。这是一系列文章的开端,接下来我还会写更多的关于算法以及数据结构的文章。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值