在理想狀態下,雜湊函式可以將關鍵字均勻的分散到陣列的不同位置,不會出現兩個關鍵字雜湊值相同(假設關鍵字數量小於陣列的大小)的情況。但是在實際使用中,經常會出現多個關鍵字雜湊值相同的情況(被對映到陣列的同乙個位置),我們將這種情況稱為雜湊衝突。為了解決雜湊衝突,主要採用下面兩種方式:
分離鍊錶法
分散鍊錶法使用鍊錶解決衝突,將雜湊值相同的元素都儲存到乙個鍊錶中。當查詢的時候,首先找到元素所在的鍊錶,然後遍歷鍊錶查詢對應的元素。下面是乙個示意圖:
來自開放定址法
開放定址法不會建立鍊錶,當關鍵字雜湊到的陣列單元已經被另外乙個關鍵字占用的時候,就會嘗試在陣列中尋找其他的單元,直到找到乙個空的單元。探測陣列空單元的方式有很多,這裡介紹一種最簡單的 -- 線性探測法。線性探測法就是從衝突的陣列單元開始,依次往後搜尋空單元,如果到陣列尾部,再從頭開始搜尋(環形查詢)。如下圖所示:
來自關於兩種方式的比較,可以參考 這篇文章。threadlocalmap 中使用開放位址法來處理雜湊衝突,而 hashmap 中使用的分離鍊錶法。之所以採用不同的方式主要是因為:在 threadlocalmap 中的雜湊值分散的十分均勻,很少會出現衝突。並且 threadlocalmap 經常需要清除無用的物件,使用純陣列更加方便。
hash,解決hash衝突的方法
數字分析法 平方取中法 除留餘數法 偽隨機數法 線性探測 二次探測 偽隨機數探測 拉鍊探測。如果負載因子是預設的0.75,hashmap 16 的時候,佔16個記憶體空間,實際上只用到了12個,超過12個就擴容。如果負載因子是1的話,hashmap 16 的時候,佔16個記憶體空間,實際上會填滿16...
雜湊(hash)表以及解決衝突的方式
把查詢表中的關鍵字對映成該關鍵字對應位址的函式,雜湊函式可能會把兩個或兩個以上的不同關鍵字對映到同一位址,稱這種情況為衝突,這些發生碰撞的不同關鍵字成為同義詞。1 直接定址法 直接取關鍵字的摸個現行函式值為雜湊位址,雜湊函式為h key a key b,其中a和b是常數,這種方法最簡單,並且不會產生...
先碼後看 mongodb資料備份與恢復
mongodb資料備份和還原主要分為二種,一種是針對於庫的mongodump和mongorestore,一種是針對庫中表的mongoexport和mongoimport。一,mongodump備份資料庫 1,常用命令格 mongodump h ip port 埠 u 使用者名稱 p 密碼 d 資料庫...