數(shù)據(jù)結(jié)構(gòu)筆記(散列查找->散列表)

為了解決動態(tài)查找的問題
散列查找法的兩項(xiàng)基本工作:

  • 計(jì)算位置:構(gòu)造散列函數(shù)確定關(guān)鍵詞存儲位置
  • 解決沖突:應(yīng)用某種策略,解決多個(gè)關(guān)鍵詞位置相同的問題
    時(shí)間復(fù)雜度幾乎為O(1)

散列表(哈希表)

  • 類型名稱:符號表(SymbolTable)
  • 數(shù)據(jù)對象集:符號表是”名字(Name)-屬性(Attribute)“對的集合
  • 裝填因子:散列表大小/填入散列表元素的個(gè)數(shù)

散列函數(shù)

數(shù)字關(guān)鍵詞的散列函數(shù)構(gòu)造

  • 直接定址法
    h(key) = a * key + b
  • 除留余數(shù)法
    h(key) = key % p(p = Tablesize,一般取素?cái)?shù))
  • 數(shù)字分析法
    取比較隨機(jī)的幾位數(shù)字組成散列地址
  • 折疊法
    把關(guān)鍵詞分成位數(shù)相同的幾個(gè)部分,然后疊加
  • 平方取中法
    大數(shù)平方,取中間幾位作為地址

字符關(guān)鍵詞的散列函數(shù)構(gòu)造

  • ASCII碼加和法
    h(key) = 每個(gè)字符ASCII碼加和 mode Tablesize
  • 前三個(gè)字符移位法
    h(key) = (key[0] * 27 ^ 2 + key[1] * 27 ^ 1 + key[2] * 27 ^ 0)mod Tablesize
  • 移位法

散列表查找性能分析

  • 成功平均查找長度(ASLs)
  • 不成功平均查找長度(ASLu)

影響散列表性能因素

  • 散列函數(shù)是否均勻
  • 處理沖突的方法
  • 散列表的裝填因子α

再散列

  • 當(dāng)裝填因子過大,查找效率下降,裝填因子最好在0.5-0.85之間
  • 解決的方法是加倍擴(kuò)大散列表,即再散列(Rehashing)

處理沖突的方法

開放地址法(Open Addressing)

hi(key) = (h(key) + di) mod Tablesize

  • 線性探測 di = i
  • 平方探測 di = ±i^2(如果表的大小設(shè)計(jì)為4k+3形式的素?cái)?shù),平方探測法可以探測到整個(gè)散列表空間)
  • 雙散列 di = i*h2(key)

分離鏈接法

  • 沖突的關(guān)鍵詞存放在同一個(gè)單鏈表中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容