常用的高效「查找」算法

 

一、二分查找

        排序的重要意义之一,就是为检索带来方便。试想有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,但是二分的思想仍然适用。

    原文作者:查找算法
    原文地址: https://blog.csdn.net/tlonline/article/details/24627899
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞