【數據結構基礎】【散列表】

散列表也叫做哈希表(hash table),這種數據結構提供了鍵(key)和值(value)的映射關系。只要給出一個key,就可以高效查找它匹配的value,時間復雜度接近O(1);

哈希函數

哈希函數通過某種方式,把key和數組下標進行轉換。
在java中,每個對象都有屬于自己的hashcode,這個hashcode是區分不同對象的重要標識。無論對象自身的類型是什么,他們的hashcode都是一個整型變量。
最簡單的轉化方式是按照數組長度進行取模運算:

index = HashCode(Key)%Array.length

JDK中的哈希函數并沒有直接采取取模運算,而是利用位運算的方式來優化性能。
通過哈希函數,我們可以把字符串或其他類型的Key,轉化成數組的下標index
例如長度為8的數組

key = 001121,
index = HashCode(“001121”)%Array.length=1420036703%8=7

散列表的讀寫擴容操作

1、寫操作:在散列表中插入新的鍵值對
例如調用:

hashMap.put("002931","王五");

具體實現方式:
1、通過哈希函數,將key轉換成數組下標,例如5
2、如果數組小標5對應的位置沒有元素,就把這個鍵值對填充到數組下標為5的位置
但是,由于數組的長度是有限的,當插入的鍵值對越來越多,不同的key通過哈希函數獲得的下標可能是相同的
這種情況叫做哈希沖突
例如:

002936的對應數組下標為2,;
002947的對應數組下標也是2;

哈希沖突是無法避免的。解決哈希沖突的方法:
1、開放尋址法
例如:第6組鍵值對通過哈希函數得到下標2,該下標在數組中已經有了其他元素,那么就向后移動1位,觀察數組下標3是否有空
如果下標3也被占用,那么就再向后移動,直到找到空的位置。
(尋址的方式有很多,并不一定只是簡單地尋找當前元素的后一個元素,這里只是簡單舉例)
2、鏈表法
HashMap數組的每個元素不僅是一個鍵值對對象,還是一個鏈表的頭結點。每一個鍵值對對象通過next指針指向它的下一個鍵值對結點。當新來的鍵值對映射到與之沖突的數組位置時,只需要插入對應的鏈表中即可:
如下圖:
在這里插入圖片描述
2、讀操作:通過給定的key,在散列表中查找對應的value
例如:調用函數hashMap.get(“002936”)
具體步驟:(以鏈表法為例)
1、通過哈希函數,將key轉換成數組下標,例如2
2、找到數組下標2對應的元素,如果這個元素的key是002936,那么就找到了
如果這個key不是002936,由于數組的每個元素都與一個鏈表對應,我們可以順著鏈表慢慢往下找,看看能否找到與key相匹配的結點

3、擴容操作:
當經過多次元素插入,散列表達到一定的飽和度時,key映射位置發生沖突的概率會逐漸提高。這樣一來,大量元素擁擠在相同的數組下標位置形成很長的鏈表,對后續的插入和查詢操作都會有很大影響。
此時就需要進行擴容:
影響擴容的因素:
1、HashMap當前長度
2、HashMap的負載因子,默認值為0.75f(在JDK中)
衡量HashMap需要進行擴容的操作如下:

HashMap.Size>=Capacity x LoadFactor

擴容具體步驟:
1、擴容,創建一個新的鍵值對空數組,長度是原數組的兩倍
2、重新Hash,遍歷原來的鍵值對數組,把所有的鍵值對重新Hash到新數組中(因為數組長度變化后,hash的規則也發生變化了)
經過擴容后,散列表重新變得稀疏。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VisualStudio運行C++項目檢測include<stdio.h>報錯解決方案

一、項目—>屬性 二、將SDL檢查更改為否即可

事業單位計算機技術崗工資,事業單位新入職的人員在管理崗位和技術崗位工資待遇是否有區別?...

解答于: 2016-05-24 17:17工傷保險條例對工傷工資待遇有說明: 第三十一條職工因工作遭受事故傷害或者患職業病需要暫停工作接受工傷醫療的,在停工留薪期內,原工資福利待遇不變,由所在單位按月支付。  停工留薪期一般…

信息設計中的“父子關系”

交互設計工作核心在于信息架構和交互細節設計。信息架構包括信息分類以及信息展示邏輯設計;交互細節則多表現為控件的選擇,交互效果的定義等。在信息設計中,遇到最棘手的問題就是信息量太多而顯得設計結果不盡人意,那么在砍不掉需…

python 示例_帶有示例的Python文件關閉屬性

python 示例文件關閉屬性 (File closed Property) closed Property is an inbuilt property of File object (IO object) in Python, it can be used to check whether a file object (i.e. a file) is closed or not, this is a read-only property and returns a Boolean val…

[Object-oriented] : 控制反轉

前言 : 參加點部落的活動,關于IoC(控制反轉)大家有很多的討論。本文排除對象生成的部份,單純解釋IoC為甚么叫做控制反轉。本篇文章以之前寫的 [Object-oriented] : 重用內容來舉例。 未IoC之前的對象圖 : 很明顯的左邊的組件A,相依右邊的組件…

二、規則組織數學模型的建立

一、規則組織數學模型的建立 規則組織滿足兩個不變:1,組織點運動規律不變、2,飛數不變的單系統組織 即:若知道組織點運動規律和飛數即可確定唯一一個組織。 3上2下,組織循環數為325,經紗循環數緯紗循環數…

LeetCode 3:無重復字符的最長子串 思考分析

給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”,所以其長度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 因為無重復字符的最長子串是 “b”&#x…

e-r模型教案高中計算機,《ER模型1》[數據庫][計算機]教案.doc

《ER模型1》[數據庫][計算機]教案一、復習舊知識點1、數據庫概念設計的意義是什么?2、概念設計的基本步驟是什么?二、明確學習目標1、E-R模型的基本元素2、屬性的分類三、重點、難點E-R模型的基本元素基本屬性和復合性四、講授知識點,指導自學…

(譯)利用ASP.NET加密和解密Web.config中連接字符串

介紹 這篇文章我將介紹如何利用ASP.NET來加密和解密Web.config中連接字符串 背景描述 在以前的博客中,我寫了許多關于介紹 Asp.net, Gridview, SQL Server, Ajax, JavaScript等的文章。大多數情況下,我都把數據庫的連接字符串放在了web.config中。其中包…

lock_sh 示例_帶有示例的Python date __str __()方法

lock_sh 示例Python date .__ str __()方法 (Python date.__str__() Method) date.__str__() method is used to manipulate objects of date class of module datetime. date .__ str __()方法用于操作模塊datetime的date類的對象。 It uses a date class object and return…

美國人看見的是友情,中國人看見的是忠誠

美國人看見的是友情,中國人看見的是忠誠 這是一個人狗情未了的感人事件。 一個即將死去的人,總有未了的心愿難以割舍,來自美國的凱文麥克萊恩實現了他的臨終愿望,而他的最后愿望就是與自己的愛犬見上最后一面。 現年57歲的凱文麥克…

PyCharm安裝及配置

一、下載PyCharm和相關工具 qoi8 二、安裝PyCharm 先不要運行PyCharm 三、將jar包放到PyCharm安裝目錄的bin文件夾下 三、找到pycharm64.exe.vmoptions和pycharm.exe.vmoptions配置文件 四、編輯這兩個文件,在這兩個文件最后一行加入下載好的jar包文件路徑 -ja…

LeetCode 239:滑動窗口最大值 思考分析

給定一個數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回滑動窗口中的最大值。 進階: 你能在線性時間復雜度內解決此題嗎? 示例: 輸入: num…

計算機論文范文1500,電子商務畢業論文范文1500字

電子商務畢業論文范文1500字時間稍縱即逝,充滿意義的大學生活即將結束,畢業前要通過最后的畢業論文,畢業論文是一種有計劃的檢驗學生學習成果的形式,那么問題來了,畢業論文應該怎么寫?下面是小編為大家整理…

為什么要使用反射機制

1、反射的構造過程 直接構造 1、加載程序集 2、根據類名構造 反射構造 1、加載程序集 2、查找需要構造類的類名 3、根據類名構造 注意: 能不用反射還是別用反射,因為畢竟要以性能做為代價, 不過在某些特定場合,還是只能用它,所以要自己根據實際情況來…

java uuid靜態方法_Java UUID timestamp()方法與示例

java uuid靜態方法UUID類timestamp()方法 (UUID Class timestamp() method) timestamp() method is available in java.util package. timestamp()方法在java.util包中可用。 timestamp() method is used to return the timestamp linked with this UUID. timestamp()方法用于返…

ANT:編譯SWC

編譯SWC使用的是compc任務&#xff0c;compc需要幾個重要的參數&#xff1a; 1、輸出路徑 2、包含的類 3、源路徑 其中第2個參數是比較難拿到的&#xff0c;需要使用ANT的幾個其他的方法來將路徑轉換了類的完整路徑&#xff0c;先看完整的代碼&#xff1a; <target name&quo…

ssm整合事務失效

<!-- 開啟注解驅動的事務管理 --><tx:annotation-driven transaction-manager"transactionManager"/>原因&#xff1a;未開啟spring事務驅動

五、規則組織的衍生組織——緯山形組織數學模型的建立

基礎概念公式推到可參考該專欄下的前幾篇博文。 緯山形組織圖&#xff1a; 觀察可知&#xff1a;緯山形組織圖下半部分是右斜組織&#xff0c;上半部分是左斜組織。右斜和左斜按照垂直方向進行排列。 該圖是一個2上3下2上1下(從最下面一行從左往右觀看) 特點&#xff1a;每一…

批處理設置計算機不休眠,虛擬機狀態下怎樣設置電腦不休眠

簽中&#xff0c;在“啟用休眠”項打勾即可啟用休眠功能。如果此項不可用&#xff0c;則說明你的電源不支持休眠功能。或如果你安裝了還原精靈等一些保護軟件&#xff0c;也無法啟用休眠功能。2 打開電腦的休眠功能后&#xff0c;在“電源選項”的“電源使用方案”標簽中&#…