第5章 雜湊

2021-08-01 06:43:39 字數 1593 閱讀 1446

5.1 一般想法

雜湊主要需要解決衝突發生時如何處理

5.2 雜湊函式

對於關鍵字為字串時,若將字串所有的字元相加得到雜湊值,則對於大表而言,其值過小,使關鍵字集中於表的前面,分布不均。若只是取前面少數字元構造多項式,則實際組合數過少,對於大表的利用率低。最好的方法是對字串的所有字元均使用多項式,提高利用率和使其分布均勻。

5.3 分離鏈結法

在分離鏈結法中,最好將元素插在鍊錶前端,因為新近插入的元素被訪問到的概率較高。

雜湊表的物件需要重寫hashcode和equal方法,前者用於計算雜湊位置,後者用於尋找元素所用。

在分離鏈結中,裝填因子一般可為1.

5.4 不用鍊錶的雜湊表

對於探測表而言,裝填因子一般為0.5.

如果使用平方探測,且表的大小為素數,那麼當表至少有一半時,那我們保證總能夠插入乙個新元素。

探測表只能選擇懶惰刪除,否則後面的尋找、刪除例程,不好判斷尋找終止條件。

在平方探測尋找例程中,位置的變換採用加法的迭代,避免了乘法和除法,提高了效率。

對於雙雜湊探測方法,第二個雜湊函式如r-(x mode r)的格式,r為小於表大小的素數。

表的大小最好為素數,避免了探測時出現迴圈探測的意外。

5.5 再雜湊

再雜湊對於分離鏈結法和開放定址法(即探測法)實際上是相當於擴容,通過改變雜湊表大小,改變了雜湊函式。

5.6 標準庫中的雜湊表

string採用了快閃儲存器雜湊**技巧,使同乙個string物件多次運用時,不用重新計算雜湊值。

對於每個不同的string物件,即使其值相同,也無法共用快閃儲存器的雜湊**,因為string的成員變數為常量修飾,更新字串時,只能建立新的string物件。

5.7 最壞情形下o(1)訪問的雜湊表

如果雜湊表的大小是元素個數的平方,發生衝突的概率小於一半。

完美雜湊採用二級雜湊表,對於二級雜湊表也使表大小為元素個數的2倍,此演算法在所有項都事先知道的情況下使用比較方便。

布穀鳥雜湊中的多表演算法、多雜湊函式演算法、多項儲存演算法其實本質上相同,均能降低衝突概率,方便插入例程實現。

布穀鳥雜湊在更換雜湊函式時,要考慮到同一函式多次選取或者同一位置被多次選中的糟糕情形。

布穀鳥分擴容和再雜湊兩個例程,擴容不更換雜湊族函式,再雜湊不改變表大小。

5.8 通用雜湊函式

((a*x + b)% p)% m

a、b是隨機數

p一般為梅森素數

m為表大小

其利用了公式:r=q+r(modp)

其中r為a*x+b

q為r/(p+1)的商,其可用右移操作,右移位數為p+1對應的2進製位數

r為r/(p+1)的餘數,其可用位與操作,使梅森素數與r位與操作可得。

最後q+r所得若大於p再減去1次p即可。

5.9 可擴雜湊

可擴雜湊在需要時才會擴容,並只擴需要的大小。提供了對大型資料的插入和查詢的快速尋找。

對知識點的理解

1.提高演算法效率的一般規則有:以空間換時間,或者犧牲某些特性

2.雜湊表通過允許存在空位置,使用雜湊索引,而失去排序資訊,來提高尋找效率。

3.雜湊表類似於分組思想,通過分組提高搜尋效率

疑難點15練習題的f小題

5 第 5 章 迴圈

1.可以用迴圈來驗證輸入。在迴圈前的第一次讀取操作,稱為啟動讀取,如果後續還需要繼續讀取,則語句應該在迴圈中。2.在實際程式設計應用中,不建議在 cout 語句中放置遞增或遞減運算子 因為容易出錯 3.需要計數時使用計數器,需要累計彙總時使用累加器。4.標記符號是乙個特殊值,指示著值列表的結尾。一般...

第5章 方法

方法的結構 方法是一塊具有名稱的 可以使用方法的名稱從別的地方執行 也可以把資料傳入方法並接受資料輸出。方法是類的函式成員。方法有兩個主要部分,方法頭和方法體。方法頭指定方法的特徵,包括 方法是否返回資料,如果返回,返回什麼型別 方法的名稱 哪種型別的資料可以傳遞給方法或從方法返回,以及應如何處理這...

第5章 陣列

一 認識陣列 傳統上把陣列 array 定義為一組有某種共同特性的元素,包括相似性和型別。每個元素由乙個特殊的識別符號來區分,稱之為鍵 key 而每個鍵對應乙個值 value usernames array 李彥巨集 馬雲 馬化騰 定義乙個陣列 預設情況下以數字作為索引的鍵名 從0開始 userna...