思路:
何為乙個工業級的雜湊表?工業級的雜湊表應該具有哪些特性?結合學過的知識,我覺的應該有這樣的要求:
1.支援快速的查詢、插入、刪除操作;
2.記憶體占用合理,不能浪費過多空間;
3.效能穩定,在極端情況下,雜湊表的效能也不會退化到無法接受的情況。
方案:如何設計這樣乙個雜湊表呢?根據前面講到的知識,我會從3個方面來考慮設計思路:
1.設計乙個合適的雜湊函式;
2.定義裝載因子閾值,並且設計動態擴容策略;
3.選擇合適的雜湊衝突解決方法。
1.要盡可能讓雜湊後的值隨機且均勻分布,這樣會盡可能減少雜湊衝突,即便衝突之後,分配到每個槽內的資料也比較均勻。
2.除此之外,雜湊函式的設計也不能太複雜,太複雜就會太耗時間,也會影響到雜湊表的效能。
3.常見的雜湊函式設計方法:直接定址法、平方取中法、摺疊法、隨機數法等。
1.如何設定裝載因子閾值?
①可以通過設定裝載因子的閾值來控制是擴容還是縮容,支援動態擴容的雜湊表,插入資料的時間複雜度使用攤還分析法。
②裝載因子的閾值設定需要權衡時間複雜度和空間複雜度。如何權衡?如果記憶體空間不緊張,對執行效率要求很高,可以降低裝載因子的閾值;相反,如果記憶體空間緊張,對執行效率要求又不高,可以增加裝載因子的閾值。
2.如何避免低效擴容?分批擴容
①分批擴容的插入操作:當有新資料要插入時,我們將資料插入新的雜湊表,並且從老的雜湊表中拿出乙個資料放入新雜湊表。每次插入都重複上面的過程。這樣插入操作就變得很快了。
②分批擴容的查詢操作:先查新雜湊表,再查老雜湊表。
③通過分批擴容的方式,任何情況下,插入乙個資料的時間複雜度都是o(1)。
①常見的2中方法:開放定址法和煉表法。
②大部分情況下,鍊錶法更加普適。而且,我們還可以通過將鍊錶法中的鍊錶改造成其他動態查詢資料結構,比如紅黑樹、跳表,來避免雜湊表時間複雜度退化成o(n),抵禦雜湊衝突攻擊。
③但是,對於小規模資料、裝載因子不高的雜湊表,比較適合用開放定址法。
一步步學資料結構與演算法 20 雜湊演算法 上
帶著問題來學習 1.如何防止資料庫中的使用者資訊被脫庫?2.你會如何儲存使用者密碼這麼重要的資料嗎?僅僅 md5 加密一下儲存就夠了嗎?3.在實際開發中,我們應該如何用雜湊演算法解決問題?1.定義 將任意長度的二進位制值串對映成固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始資料對映...
一步步學資料結構與演算法 10 遞迴
1.遞迴是一種非常高效 簡潔的編碼技巧,一種應用非常廣泛的演算法,比如dfs深度優先搜尋 前中後序二叉樹遍歷等都是使用遞迴。2.方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。3.基本上,所有的遞迴問題都可以用遞推公式來表示,比如 f n f n 1 1 f n f n 1 f n 2...
一步步學ROS
最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...