1. 程式人生 > >STL hashmap原理及衝突解決

STL hashmap原理及衝突解決

大家平時都用過hashMap,但是可能大家對hashMap的底層實現不太瞭解,同時對其中可能出現的hash衝突有些不瞭解,這幾天我翻了下資料,也稍微瞭解下,記錄下來,以免遺忘。

這裡寫圖片描述

上圖就是一個散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。但是當關鍵字數量比較大的時候,難免就會造成一個問題,就是不一樣的關鍵字隱射到同一個地址上,這樣就造成了一個問題,就是hash衝突。那麼如何解決呢?

一般比較常用的方法有開放地址法:(內容來自百度百科) 
1. 開放定址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)為雜湊函式,m為散列表長,di為增量序列,可有下列三種取法: 
1.1. di=1,2,3,…,m-1,稱線性探測再雜湊;順序查看錶的下一單元,直至找到某個空單元,或查遍全表。 
1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)稱二次探測再雜湊;在表的左右進行跳躍式探測。 
1.3. di=偽隨機數序列,稱偽隨機探測再雜湊。根據產生的隨機數進行探測。

2 再雜湊法:建立多個hash函式,若是當發生hash衝突的時候,使用下一個hash函式,直到找到可以存放元素的位置。

3 拉鍊法(鏈地址法):就是在衝突的位置上簡歷一個連結串列,然後將衝突的元素插入到連結串列尾端,

4 建立公共溢位區:將雜湊表分為基本表和溢位表,將與基本表發生衝突的元素放入溢位表中。

底層的hashMap是由陣列和連結串列來實現的,就是上面說的拉鍊法。首先當插入的時候,會根據key的hash值然後計算出相應的陣列下標,計算方法是index = hashcode%table.length,(這個下標就是上面提到的bucket),當這個下標上面已經存在元素的時候那麼就會形成連結串列,將後插入的元素放到尾端,若是下標上面沒有存在元素的話,那麼將直接將元素放到這個位置上。 
當進行查詢的時候,同樣會根據key的hash值先計算相應的下標,然後到相應的位置上進行查詢,若是這個下標上面有很多元素的話,那麼將在這個連結串列上一直查詢直到找到對應的元素。

相關推薦

STL hashmap原理衝突解決

大家平時都用過hashMap,但是可能大家對hashMap的底層實現不太瞭解,同時對其中可能出現的hash衝突有些不瞭解,這幾天我翻了下資料,也稍微瞭解下,記錄下來,以免遺忘。 上圖就是一個散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)

HashMap原理衝突解決辦法

class HashMap<K,V> extends AbstractMap<K,V> HashMap  put() HashMap  get() 1.put()   HashMap put()方法原始碼如下:

HashMap原理以及如何解決衝突問題

面試時最經典也是最喜歡問的集合是HashMap了 1:先說一下HashMap的資料結構:      HashMap是一個雜湊表,其底層可以說是陣列加連結串列結構:看圖直觀明瞭     HashMap的預設容量是16,當到達16時,HashMap會根據負載因子(預設

HashMap原理put與get方法呼叫過程

HashMap的原理 HashMap的資料結構為陣列+連結串列,以key,value的形式存值,通過呼叫put與get方法來存值與取值。 它內部維護了一個Entry陣列,得到key的hashCode值將其移位按位與運算,然後再通過跟陣列的長度-1作邏輯與運算

iOS 手勢新增衝突解決

例子: 設定一個背景檢視 DoModalView = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds]; DoModalView

【集合框架】HashMap原理原始碼解讀

本文加上個人理解,用自己的話表達集合框架及對HashMap細節的理解。 簡介 HashMap是一種利用鍵值對映儲存資料的資料結構,隨著jdk的發展,在jdk1.8中引入了紅黑樹的資料結構和擴容的優化。 Map類常用集合介紹 HashMap實現自java.uti

淺談CPRI原理測試解決方案(轉)

分散式基站結構的核心概念就是把傳統巨集基站基帶處理單元(BBU)和射頻處理單元(RRU)分離,二者通過光纖相連。在網路部署時,將基帶處理單元與核心網、無線網路控制裝置集中在機房內,通過光纖與規劃站點上部署的射頻拉遠單元進行連線,完成網路覆蓋,從而降低建設維護成本、提高效率

雜湊、HashMap原理原始碼、Hash的一些應用面試題

一、雜湊定義     Hash,一般翻譯做“雜湊”,也有直接音譯為"雜湊"的,就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不 同的輸入可

HashMap原理 Java 中陣列的最大長度是多少——華為面試總結

今天去華為面試 ,感受收穫特別大,感謝開發小哥, 問到我HashMap原理 及陣列的最大長度是多少,經過網路瞭解如下:   2. java 中陣列的最大長度是多少呢?看一下它的length屬性就可以了。length屬性是32位的有符號整數,它的最大值是2的31次冪,就

HashMap原理詳解

HashMap是我們使用非常多的Collection,它是基於雜湊表的 Map 介面的實現,以key-value的形式存在。在HashMap中,key-value總是會當做一個整體來處理,系統會根據hash演算法來來計算key-value的儲存位置,我們總是可以通過key快

RTC入門教程衝突解決技巧

1 RTC簡介 1.1 什麼是RTC IBM Rational Team Concert,是Jazz家族中的一員。它是一個團隊合作軟體環境,能夠實現程式碼版本管理、專案進度管理及監督產品釋出等功能。在前期設計過程中,設定好迭代週期與checkpoint,利用workit

Android關於libs,jniLibs庫的基本使用說明衝突解決

最近在開發中遇到了一個問題,因為專案需要整合不同的sdk。相對應的也是不同的.so檔案。 針對libs中.so庫的引入會遇到一些

HashMap之Hash碰撞衝突解決方案未來改進

通過前面的原始碼分析可知,HashMap 採用一種所謂的“Hash 演算法”來決定每個元素的儲存位置。當程式執行put(String,Obect)方法 時,系統將呼叫String的 hashCode() 方法得到其 hashCode 值——每個 Java 物件

裝置衝突原理解決

  也許你有過這樣的經歷,在你的計算機插上某個新的板卡後,某個程式不能運行了,或者是計算機的某個部件不能工作了,甚至於整個機器都不能動彈了。於是,你就開始抱怨,買的這個板卡有問題,或者是相容性不好,其實此類問題並不是新卡的問題,而是它和其他的計算機裝置之間產生的裝置衝突。

HashMap和HashTable區別Hash衝突解決方法

一、HashMap和HashTable主要有以下5個方面的區別: 1.繼承的父類不同   Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但二者都實現了Map介面。 2.對null物件的支援不同   HashMap是支援

ANR型別解決方法 && 基本演算法 && HashMap原理

一、ANR型別 ANR(Application Not Responding,即應用無響應)一般有三種類型: 1:KeyDispatchTimeout(5 seconds) --主要型別 按鍵或觸控事件在特定時間內無響應,dispatchTimeout 輸入事件分發超時,一

1.Java集合-HashMap實現原理源碼分析

int -1 詳細 鏈接 理解 dac hash函數 順序存儲結構 對象儲存   哈希表(Hash Table)也叫散列表,是一種非常重要的數據結構,應用場景及其豐富,許多緩存技術(比如memcached)的核心其實就是在內存中維護一張大的哈希表,而HashMap的實

Ajax跨域原理解決方案

一次 變化 mes iframe 實現 type .ajax 一個 min 跨域請求的產生 跨域請求歸根結底是由於瀏覽器的“同源策略”引起的,同源策略指的是域名相同、協議相同、端口相同, 假設有http://www.a.com/test.html,下面的示例 域名不同 h

HashMap實現原理源碼分析

響應 應用場景 取模運算 圖片 mat 直接 maximum 計算 時間復雜度 哈希表(hash table)也叫散列表,是一種非常重要的數據結構,應用場景及其豐富,許多緩存技術(比如memcached)的核心其實就是在內存中維護一張大的哈希表,而HashMap的實現原理也

代理伺服器的原理用法(解決上網時間限制問題)

解決公司限制上網時間問題 一、代理伺服器原理【Proxy Serve】: 代理伺服器就類似代理商,如圖,假設你的機器為A機,你想獲得的資料由B機提供,代理伺服器為C機,那麼具體的連線過程是這樣的: 首先,A機需要B機的資料,它與C機建立連線,C機接收到A機的資料請求後,與B