常用的高效「查找」算法

来源:互联网 发布:小岚云 骆玉笙 知乎 编辑:程序博客网 时间:2024/05/18 01:06

 

一、二分查找

        排序的重要意义之一,就是为检索带来方便。试想有10^6个整数,你希望确认其中是否包含12345。最容易想到的方法就是把它们放到数组A中,然后依次检查这些整数是否等于12345。这样的方式对于单次询问来说,工作得很好,但如果需要查找10000个数,就需要把整个数组A遍历10000次,而如果事先将数组A排序,就可以查找得更快——就好比在字典中查找单次不必一页一页翻一样。

        在有序表中查找元素常常使用二分查找(BinarySearch)。它的基本思路就像是“猜数字游戏”:你在心里想一个不超过1000的正整数,我可以保证在10次之内猜到——只要你每次告诉我猜的数比你想的大一些、小一些,或者正好猜中。

        猜的方法就是二分。首先我猜500,除了运气特别好正好猜中以外,不管你说太大还是太小,我都能把可行范围缩小一般:如果太大,那么答案在1-499之间,如果太小,那么答案在501-1000之间。只要每次选择可行区间的中点去猜,每次都可以把范围缩小一半。由于log2(1000) <10所以10次一定能猜得到。

        这也是二分查找的基本思路。注意:二分查找只适用于有序序列。

int binarysearch(int *A,int x,int y,int v){    int m;    while(x<y)    {        m=x+(y-x)/2;        if(A[m] == v) return m;        else if (A[m] > v) y=m;        else x = m+1;    }    return -1; /**未查找到*/}


二分查找常常用在一些抽象的场合,没有数组A,也没有要查找的v,但是二分的思想仍然适用。

0 0
原创粉丝点击