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

来源:互联网 发布:mac的library在哪 编辑:程序博客网 时间:2024/06/05 07:47

问题描述

有一个大小为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
原创粉丝点击