查找算法—斐波那契查找算法分析與實現(Python)

December 21, 2015 12:36 PM
黃金比例又稱黃金分割,是指事物各部分間一定的數學比例關係,即將整體一分爲二,較大部分與較小部分之比等於整體與較大部分之比,其比值約爲1:0.618或1.618:1。
0.618被公認爲最具有審美意義的比例數字,這個數值的作用不僅僅體現在諸如繪畫、雕塑、音樂、建築等藝術領域,而且在管理、工程設計等方面也有着不可忽視的作用。因此被稱爲黃金分割。
斐波那契查找的核心是:
1)當key=a[mid]時,查找成功;
2)當key<a[mid]時,新的查找範圍是第low個到第mid-1個,此時範圍個數爲F[k-1] - 1個,即數組左邊的長度,所以要在[low, F[k - 1] - 1]範圍內查找;
3)當key>a[mid]時,新的查找範圍是第mid+1個到第high個,此時範圍個數爲F[k-2] - 1個,即數組右邊的長度,所以要在[F[k - 2] - 1]範圍內查找。
時間複雜度:如果要查找的記錄在右側,則左邊的數據都不用在哦按段了,不斷反覆進行下去,對處於當中的大部分數據源,其工作效率要高一些所以儘管斐波那契查找的時間複雜度也爲O(logn)。但品均性能上來說,斐波那契查找要優於折半查找,可惜如果是最壞情況,比如這裏key=1的時候,那麼始終都處於左側長半區在查找,則查找效率要低於折半查找。

還有一點比較關鍵,折半查找是進行加法與除法運算(mid={low+high}/2),插值查找進行復雜的四則運算(mid=low+(high-low)*(key-a[low])/(a[high]-a[low])),而斐波那契額查找只是最簡單加減運算(mid=low+F[k-1]-1),在海量數據的查找過程中,這種細微的差別可能會影響最終的查找效率。

應該說“順序表查找”、“折半查找”、“插值查找”這三種查找本質上是分隔點不同,各有優劣,實際開發過程中可根據實際情況中數據的綜合特點再做出選擇。

#FibonacciSearch.py
#王淵
#2014.12.20
#Email:[email protected]

from pylab import *

def FibonacciSearch(data, length, key):
    F = [0,1]
    count = 1;
    low = 0
    high = length-1
    if(key < data[low] or key>data[high]):                      #索引超出範圍返回錯誤
        print("Error!!! The ", key, " is not in the data!!!")
        return -1

    data = list(data)
    while F[count] < length:                    #生成斐波那契數列
        F.append(F[count-1] + F[count])
        count = count + 1
    low = F[0]
    high = F[count]

    while length-1 < F[count-1]:                #將數據個數補全
        data.append(data[length-1])
        length = length + 1
    data = array(data)
    while(low<=high):
        mid = low+F[count-1]                    #計算當前分割下標
        if(data[mid] > key):                    #若查找記錄小於當前分割記錄
            high = mid-1                        #調整分割記錄
            count = count-1
        elif(data[mid] < key):                  #若查找記錄大於當前分割記錄
            low = mid+1
            count = count-2
        else:                                   #若查找記錄等於當前分割記錄
            return mid
    if(data[mid] != key):                                       #數據key不在查詢列表data中返回錯誤
        print("Error!!! The ", key, " is not in the data!!!")
        return -1

length = 11

data = array([0,1,16,24,35,48,59,62,73,88,99])
key = 35
idx = FibonacciSearch(data, length, key)
print(data)
print("The ", key, " is the ", idx+1, "th value of the data.")

運行結果:

[ 0  1 16 24 35 48 59 62 73 88 99]
The  35  is the  5 th value of the data.
發佈了30 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章