python-哈希查找-時間複雜度O(1)

哈希查找是通過計算數據元素的存儲地址進行查找的一種方法。

比如”5“是一個要保存的數,然後我丟給哈希函數,哈希函數給我返回一個”2”,那麼此時的”5“和“2”就建立一種對應關係,這種關係就是所謂的“哈希關係”,在實際應用中也就形成了”2“是key,”5“是value。

哈希必須要遵守兩點原則:
①: key儘可能的分散,也就是我丟一個“6”和“5”給你,你都返回一個“2”,那麼這樣的哈希函數不盡完美。
②: 哈希函數儘可能的簡單,也就是說丟一個“6”給你,你哈希函數要搞1小時才能給我,這樣也是不好的。

常用的哈希函數構造方法:

  • 直接定址法:很容易理解,key=Value+C; 這個“C”是常量。Value+C其實就是一個簡單的哈希函數。
  • 除法取餘法: 很容易理解, key=value%C;解釋同上。
  • 數字分析法:這種蠻有意思,比如有一組value1=112233,value2=112633,value3=119033,針對這樣的數我們分析數中間兩個數比較波動,其他數不變。那麼我們取key的值就可以是key1=22,key2=26,key3=90。
  • 平方取中法。此處忽略,見名識意。
  • 摺疊法:這種蠻有意思,比如value=135790,要求key是2位數的散列值。那麼我們將value變爲13+57+90=160,然後去掉高位“1”,此時key=60,哈哈,這就是他們的哈希關係,這樣做的目的就是key與每一位value都相關,來做到“散列地址”儘可能分散的目地。

    ·

當兩個不同的數據元素的哈希值相同時,就會發生衝突。解決衝突常用的手法有2種:

  • 開放地址法:如果兩個數據元素的哈希值相同,則在哈希表中爲後插入的數據元素另外選擇一個表項。當程序查找哈希表時,如果沒有在第一個對應的哈希表項中找到符合查找要求的數據元素,程序就會繼續往後查找,直到找到一個符合查找要求的數據元素,或者遇到一個空的表項。
  • 鏈接法:將哈希值相同的數據元素存放在一個鏈表中,在查找哈希表的過程中,當查找到這個鏈表時,必須採用線性查找方法。

代碼

#coding=utf-8
__author__ = 'a359680405'

#除法取餘法實現的哈希函數
def myHash(data,hashLength,):
    return data % hashLength
#哈希表檢索數據
def searchHash(hash,hashLength,data):
    hashAddress=myHash(data,hashLength)
   #指定hashAddress存在,但並非關鍵值,則用開放尋址法解決
    while hash.get(hashAddress) and hash[hashAddress]!=data:
        hashAddress+=1
        hashAddress=hashAddress%hashLength
    if hash.get(hashAddress)==None:
        return None
    return hashAddress

#數據插入哈希表
def insertHash(hash,hashLength,data):
    hashAddress=myHash(data,hashLength)
    #如果key存在說明應經被別人佔用, 需要解決衝突
    while(hash.get(hashAddress)):
        #用開放尋執法
        hashAddress+=1
        hashAddress=myHash(hashAddress,hashLength)
    hash[hashAddress]=data

if __name__ == '__main__':
    hashLength=20
    L=[13, 29, 27, 28, 26, 30, 38 ]
    hash={}
    for i in L:
        insertHash(hash,hashLength,i)
    result=searchHash(hash,hashLength,38)
    if result:
        print("數據已找到,索引位置在",result)
        print(hash[result])
    else:
        print("沒有找到數據")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

時間複雜度O(1)

轉載地址http://blog.csdn.net/a359680405/article/details/51152084



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