雜湊表具有和陣列相同的可以根據下標實現隨機訪問的特性。
【陣列查詢的特性】:
陣列的儲存空間是連續的,因此對取值(訪問)操作比較友好,支援根據下標實現隨機訪問,時間複雜度為 o(1)。
【雜湊表】:
雜湊表採用了陣列可以根據下標實現隨機訪問,時間複雜度為 o(1) 的特性。
問 1:那雜湊表是怎樣將陣列的特性應用到自身的呢?
答 1 :
陣列的下標本質上是乙個索引,通過索引找到對應位置存放的值。
雜湊表也是通過乙個索引來訪問對應位置儲存的值。
陣列的索引只能是整數下標,即 0,1,... ,n
雜湊表的索引可以是任意整數或者字串,可以根據實際應用的需求設定。
問 2:那雜湊表是怎樣實現使字串也可以作為索引的呢?
答 2:關鍵就在於雜湊函式。
雜湊函式可以將任意長度和型別的輸入通過雜湊演算法輸出乙個固定長度的雜湊值。這個過程可以看做乙個對映。即將任何長度的輸入對映為固定長度的輸出。
問 3:乙個理想的雜湊函式是什麼樣的?
答 3:1. 應當使每乙個不同輸入都有不同的輸出
2. 雜湊函式的雜湊值應當是均勻分布的。
然而現實中,對於大規模資料的雜湊表並不存在如此理想的雜湊函式。
雖然乙個函式可以最大化實現對於不同輸入的雜湊值均勻分布,但是卻很難實現每乙個輸入都單獨擁有乙個雜湊值。這種現象可以參考抽屜原理。
抽屜原理:簡單的說就是,我有 5 個球,但是卻只有 4 個抽屜,把這 5 個球全部裝入抽屜裡,必定有乙個抽屜裡有兩個球。
問 4:抽屜原理反映在雜湊表中會出現什麼問題呢?
答 4:雜湊衝突。
雜湊衝突就是兩個不一樣的輸入,或者說兩個不一樣的索引,雜湊後的雜湊值卻是一樣的。
問 5:雜湊衝突的解決方法?
答 5:開放定址法和鍊錶法。
開放定址法 :開放定址法中所使用的資料結構是陣列。當發生雜湊衝突時,就往後乙個乙個地尋找空閒位置,然後插入。這種方法只適用於小規模資料,
鍊錶法:將每乙個雜湊值視為乙個桶,對落到相同桶裡的值使用鍊錶連線起來。
相較於開放定址法,鍊錶法有更多的可優化空間。比如,對於同乙個桶裡的值,鍊錶法可以改變資料結構來優化查詢時間。可以將鍊錶結構使用二叉樹、紅黑樹等高效的查詢的資料結構取代。
雙雜湊和再雜湊暨雜湊表總結(附理解)
先說明一下,她們兩個屬於不同的範疇,雙雜湊屬於開放定址法,仍是一種解決衝突的策略。而再雜湊是為了解決插入操作執行時間過長 插入失敗問題的策略。簡而言之,她們的區別在於 前者讓雜湊表做的 對 把衝突元素按規則安排到合理位置 後者讓雜湊表具有了可擴充性,可以動態調整 不用擔心填滿了怎麼辦 我們來考察最後...
虛表思考 再探虛表布局
思考類的布局,以前一直以為 乙個類可能有多個虛表。今天下午特別的寫程式測試下。結論是 無論乙個類怎麼繼承來的,他的虛表只有乙個!感覺 注意 虛表的理解,至少2個層次,動靜結合 靜,要知道 類的布局 動,要知道函式 動態繫結 include stdafx.h include using namespa...
再思考 1025 反轉鍊錶 25
給定乙個常數k以及乙個單鏈表l,請編寫程式將l中每k個結點反轉。例如 給定l為1 2 3 4 5 6,k為3,則輸出應該為3 2 1 6 5 4 如果k為4,則輸出應該為4 3 2 1 5 6,即最後不到k個元素不反轉。輸入格式 每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的位址 結點...