【算法学习笔记二】查找搜索算法

一.顺序搜索(Linear search)

对于一个n元数组,查找某一元素是否等于x,则需要将数组从头到尾与x做判断,运气好的话,可能比较第一次就找到,运气坏的话可能最后一个元素才找到或者都没找不到,即元素比较次数是1~n之间。

输入:n个元素的数组A[1...n]和元素x
输出:如果x=A[j],1≤j≤n,则输出j,否则输出0
    j<-1
    while (j<n) and (x≠A[j])
        j<-j+1
    end while
    if x=A[j] then return j else return 0

二.二分搜索(Binary search)

令A[low...high]为元素按升序排列的非空数组,A[mid]为中间元素,假定x>A[mid]且在A中,则它必在A数组的右半集合中,接下来只需在A[mid+1...high]中搜索x,A[low...mid]被丢弃掉。循环搜索,直至找到x。

    low<-1, high<-n, j<-0
    while (low≤high) and (j=0)
        mid<-(low+high)/2(取下整)
        if x=A[mid] then j<-mid
        else if x<A[mid] then high<-mid-1
        else low<-mid+1
    end while
    return j

对于一个大小为n的排序数组,算法二分查找执行比较的最大次数为$\lfloor logn \rfloor$+1

证明过程:

整个搜索过程是都有元素折半的操作,第一次比较后,丢弃一半的元素,第二次比较再丢弃一半的一半的元素,直至结束。即,

第一次循环开始时元素的个数$\lfloor n/2^0 \rfloor$

第二次循环开始时元素的个数$\lfloor n/2 \rfloor$

第三次循环开始时元素的个数$\lfloor $\lfloor n/2 \rfloor$/2 \rfloor$ = $\lfloor n/2^2 \rfloor$

第j次循环开始时元素的个数$\lfloor n/2^{j-1}\rfloor$......

$\lfloor n/2^{j-1}\rfloor$=1时,算法结束,则j表示二分查找的最大比较次数,即$1 \leq n/2^{j-1} \textless 2$时结束算法,化简得$j-1 \leq logn \textless j$,则j=$\lfloor logn \rfloor$+1,得证。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章