【算法學習筆記二】查找搜索算法

一.順序搜索(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,得證。

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