1. 程式人生 > >算法導論筆記——第十~十一章 數據結構(一) 散列

算法導論筆記——第十~十一章 數據結構(一) 散列

發生 情況 要求 sub 裝載 ted 因子 let 完全

第十章 基本數據結構

棧:可由數組表示

隊列:可由數組表示

指針和對象:可由多數組表示。可用棧表示free list

有根數:

  二叉樹:左右孩子

  分支無限制:左孩子右兄弟表示法

第十一章 散列表

數組:為每個元素保留一個位置

散列表:用於實際存儲關鍵字比全部可能關鍵字少很多時,比如字典操作

解決散列沖突:鏈接法,開放尋址法

11.2 散列表

用鏈表法,在簡單均勻散列的假設下,一次成功或不成功的查找所需要的平均時間為Θ(1+α),α為load factor。

11.3 散列函數

好的散列函數應(近似地)滿足簡單均勻假設:每個關鍵字都被等肯能地散列到m個槽位中的任何一個,並與其它關鍵字已散列到哪個槽位無關。

  利用關鍵字分布的有用信息。如“pt”,“pts”不沖突

  一種好的方法導出的散列值,在某種程度上應獨立於數據可能存在的任何模式。如除法散列

  散列函數的某些應用可能會要求比簡單均勻散列更強的性質,如全域散列可使相似關鍵字有截然不同散列值。

全域散列函數:一組函數H稱為全域的,如果對每一對不同的關鍵字k,l屬於U,滿足h(k)=h(l)的散列函數個數至多為[H]/m,m為槽位數。

  如:p為足夠大素數,使得每一關鍵字k都在[0,p-1],Zp={0,1,...,p-1},Zp*={1,2,...,p-1},

    hab(k)=((ak+b)mod p)mod m

    Hpm={hab

: a屬於Zp*,b屬於Zp}

  11.4 開放尋址法

  所有元素都在散列表中,裝載因子不超過1。探查順序是0~m-1的一個排列,依賴於h(k,i),i為探查號。不使用指針,節省空間。

  但有關鍵字刪除時即使設置標誌deleted,查找時間也不再依賴於a。這種情況更適合用鏈接法來解決沖突。

  均勻散列:每個關鍵字的探查序列等可能地為0~m-1的m!種排列的任一種。難實現,只能近似(如雙重散列)。

  三種技術:線性探查,二次探查,雙重探查。

  線性探查:h(k,i)=(h‘(k)+i)mod m。連續被占用時間越多,查找時間越長。

  二次探查:h(k,i)=(h‘(k)+c1i+c2

i2)mod m。初始位置決定探查序列。

  雙重探查:h(k,i)=(h1(k)+ih2(k))mod m。

  11.5 完全散列

  散列有良好的平均性能。

  特別地,當關鍵值是靜態(存入後不變,如程序的保留字)時,完全散列能提供出色的最壞情況性能O(1)。

  通過兩級的散列來設計完全散列方案,在每級上都使用全域散列。二次散列表不用鏈表,通過精心選擇hi,確保在第二級上不發生沖突。

  定理11.9: 如果從一個全域散列函數類中隨機算出散列函數h,將n個關鍵字存儲在一個大小為m=n2的散列表中,那麽表中出現沖突的概率小於1/2.

技術分享

  定理11.10: 如果從一個全域散列函數類中隨機算出散列函數h,用它將n個關鍵字存儲在一個大小為m=n的散列表中,則有

    E[Σnj2]<2n  nj為散列到槽j的關鍵值數。

  推論:如果二次散列大小為mj=nj2,則存儲所有二次散列表所需的存儲總量的期望值小於2n。

  推論2:存儲所有二次散列表的存儲總量等於或大於4n的概率小於1/2。

算法導論筆記——第十~十一章 數據結構(一) 散列