19.哈希表的實現

1.哈希的概念

哈希(hash)?稱散列,是?種組織數據的?式。從譯名來看,有散亂排列的意思。本質就是通過哈希函數把關鍵字Key跟存儲位置建??個映射關系,查找時通過這個哈希函數計算出Key存儲的位置,進?快速查找。

1.2.直接定址法

當關鍵字的范圍?較集中時,直接定址法就是?常簡單?效的?法,?如?組關鍵字都在[0,99]之間,那么我們開?個100個數的數組,每個關鍵字的值直接就是存儲位置的下標。再?如?組關鍵字值都在[a,z]的?寫字?,那么我們開?個26個數的數組,每個關鍵字acsii碼-a ascii碼就是存儲位置的下標。也就是說直接定址法本質就是?關鍵字計算出?個絕對位置或者相對位置

1.3.哈希沖突?

直接定址法的缺點也?常明顯,當關鍵字的范圍?較分散時,就很浪費內存甚?內存不夠?。

這?存在的?個問題就是,兩個不同的key可能會映射到同?個位置去,這種問題我們叫做哈希沖突。

1.4.負載因子

假設哈希表中已經映射存儲了N個值,哈希表的大小為M,那么 負載因子 = N/M ,負載因?有些地?也翻譯為載荷因?/裝載因?等,他的英?為load factor。負載因?越?,哈希沖突的概率越?,空間利?率越?;負載因?越?,哈希沖突的概率越低,空間利?率越低。

1.5.將關鍵字轉為整數

我們將關鍵字映射到數組中位置,?般是整數好做映射計算,如果不是整數,我們要想辦法轉換成整數。后面給具體實現方法。

2.哈希函數

?個好的哈希函數應該讓N個關鍵字被等概率的均勻的散列分布到哈希表的M個空間中,但是實際中卻很難做到,但是我們要盡量往這個?向去考量設計。

2.1除法散列法

假設哈希表的??為M,那么通過key除以M的余數作為映射位置的下標,也就是哈希函數為:h(key) = key % M。

當使?除法散列法時,要盡量避免M為某些值,如2的冪,10的冪等。如果是2^x ,那么key %

2^x本質相當于保留key的后X位,那么后x位相同的值,計算出的哈希值都是?樣的,就沖突了。如: {63 , 31}看起來沒有關聯的值,如果M是16,也就是2^4 ,那么計算出的哈希值都是15,因為63的? 進制后8位是 00111111,31的?進制后8位是 00011111。如果是10^2 ,就更明顯了,保留的都是10進值的后x位,如:{112, 12312},如果M是100,也就是10^2 ,那么計算出的哈希值都是12。

當使?除法散列法時,建議M取不太接近2的整數次冪的?個質數(素數)。

3.處理哈希沖突

實踐中哈希表?般還是選擇除法散列法作為哈希函數,當然哈希表?論選擇什么哈希函數也避免不了沖突,那么插?數據時,如何解決沖突呢?主要有兩種兩種?法,開放定址法和鏈地址法。

3.1開放定址法

在開放定址法中所有的元素都放到哈希表?,當?個關鍵字key?哈希函數計算出的位置沖突了,則按照某種規則找到?個沒有存儲數據的位置進?存儲,開放定址法中負載因??定是?于1的。
1.線性探測:
1.1 從發?沖突的位置開始,依次線性向后探測,直到尋找到下?個沒有存儲數據的位置為?,如果?
到哈希表尾,則回繞到哈希表頭的位置。1.2 h(key) = hash0 = key % M,, hash0位置沖突了,則線性探測公式為:
hc(key,i) = hashi = (hash0 + i) % M, i = {1, 2, 3, ..., M ? 1},
因為負載因??于1,則最多探測M-1次,?定能找到?個存儲key的位置。2.?次探測:
2.1 從發?沖突的位置開始,依次左右按?次?跳躍式探測,直到尋找到下?個沒有存儲數據的位置為
?,如果往右?到哈希表尾,則回繞到哈希表頭的位置;如果往左?到哈希表頭,則回繞到哈希表
尾的位置;
2.2 h(key) = hash0 = key % M , hash0位置沖突了,則?次探測公式為:
hc(key,i) = hashi = (hash0 ± i^2 ) % M, i = {1, 2, 3, ..., M/2}
2.3 ?次探測當 hashi = (hash0 ? i^2)%M 時,當hashi<0時,需要hashi += M

3.2擴容:

這?哈希表負載因?控制在0.7,當負載因?到0.7以后我們就需要擴容了,我們還是按照2倍擴容,但是同時我們要保持哈希表??是?個質數,第?個是質數,2倍后就不是質數了。那么如何解決了,?種?案就是除法散列中Java HashMap的使?2的整數冪,但是計算時不能直接取模的改進?法。另外?種?案是sgi版本的哈希表使?的?法,給了?個近似2倍的質數表,每次去質數表獲取擴容后的??。

3.3key不能取模的問題

當key是string/自定義等類型時,key不能取模, 那么我們需要給HashTable增加?個仿函數,這個仿函 數?持把key轉換成?個可以取模的整形,如果key可以轉換為整形并且不容易沖突,那么這個仿函數 就?默認參數即可,如果這個Key不能轉換為整形,我們就需要??實現?個仿函數傳給這個參數,實 現這個仿函數的要求就是盡量key的每值都參與到計算中,讓不同的key轉換出的整形值不同。string 做哈希表的key?常常?,所以我們可以考慮把string特化?下。

3.4開放定址法代碼實現

*3.4鏈地址法

哈希表中存儲?個指針,沒有數據映射這個位置時,這個指針為空,有多個數據映射到這個位置時,我們把這些沖突的數據鏈接成?個鏈表,掛在哈希表這個位置下?,鏈地址法也叫做拉鏈法或者哈希桶。

擴容:

開放定址法負載因?必須?于1,鏈地址法的負載因?就沒有限制了,可以?于1。負載因?越?,哈希沖突的概率越?,空間利?率越?;負載因?越?,哈希沖突的概率越低,空間利?率越低;stl中unordered_xxx的最?負載因?基本控制在1,?于1就擴容。
極端場景:
如果極端場景下,某個桶特別?怎么辦?這是把鏈表轉換成紅黑樹,提供一個思路。

3.5鏈地址法代碼實現

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

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

相關文章

IoTDB TTL不生效

問題 時序數據庫 IoTDB 1.3.0 版本數據庫的 TTL 設置為兩天&#xff0c;show databases details 看到設置也是正確的&#xff0c;怎么還是可以查到好幾天前的數據&#xff1f;因為有很多不活躍的測點&#xff0c;所以專門設置了兩天過期&#xff0c;有什么辦法可以自動清理呢&…

【C++基礎】Lambda 函數 基礎知識講解學習及難點解析

一、引入 在 C 中&#xff0c;我們通常使用函數來完成特定的功能。但有時候&#xff0c;我們需要在一個函數內部定義一個小型的功能塊&#xff0c;這時如果單獨寫一個函數會顯得繁瑣。C11 引入了 Lambda 函數&#xff0c;它是一種匿名函數&#xff0c;可以在需要的地方直接定義…

OpenCV 基礎模塊 Python 版

OpenCV 基礎模塊權威指南&#xff08;Python 版&#xff09; 一、模塊全景圖 plaintext OpenCV 架構 (v4.x) ├─ 核心層 │ ├─ core&#xff1a;基礎數據結構與操作&#xff08;Mat/Scalar/Point&#xff09; │ └─ imgproc&#xff1a;圖像處理流水線&#xff08;濾…

iStoreOS軟路由對硬盤格式化分區(轉化ext4)

一、為什么要格式化分區&#xff1f; 格式化硬盤分區是軟路由安裝或配置過程中的重要步驟&#xff0c;主要用于清除舊數據、優化文件系統、確保系統穩定性和兼容性。 二、通過iStoreOS硬盤格式化步驟 使用場景&#xff1a;Docker遷移到外置移動硬盤為例&#xff0c;考慮兼容現…

打造用戶認證系統,構筑信息安全防線

在當今的數字化時代&#xff0c;信息安全和用戶隱私保護變得越來越重要。用戶身份認證是確保信息安全的第一道防線。通過驗證用戶身份&#xff0c;可以防止未經授權的訪問和數據泄露。它有助于保護用戶的個人信息、賬戶資金和其他敏感數據。此外&#xff0c;用戶身份認證還可以…

北京南文觀點:品牌如何搶占AI 認知的 “黃金節點“

在算法主導的信息洪流中&#xff0c;品牌正在經歷一場隱蔽的認知權爭奪戰&#xff0c;當用戶向ChatGPT咨詢"哪家新能源車企技術最可靠"時&#xff0c;AI調取的知識圖譜數據源將直接決定品牌認知排序。南文樂園科技文化&#xff08;北京&#xff09;有限公司&#xff…

音視頻系列——Websockets接口封裝為Http接口

模型服務示例&#xff1a;實時語音轉文本服務 本示例展示一個支持雙協議&#xff08;WebSocket流式接口HTTP同步接口&#xff09;的語音轉文本模型服務&#xff0c;并提供將WebSocket接口封裝為HTTP接口的代碼實現。 一、服務架構設計 #mermaid-svg-nw0dMZ4uKfS4vGZR {font-fa…

Axure項目實戰:智慧城市APP(一)(動態面板、拖動效果)

親愛的小伙伴&#xff0c;在您瀏覽之前&#xff0c;煩請關注一下&#xff0c;在此深表感謝&#xff01; 課程主題&#xff1a;智慧城市APP便民服務平臺 主要內容&#xff1a;完整智慧APP原型設計 應用場景&#xff1a;各類政務型、B端APP均可參考 案例展示&#xff1a;&…

MySQL 入門大全:數據類型

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;…

Java 記憶鏈表,LinkedList 的升級版

文章目錄 記憶鏈表 MemoryLinkedList實戰源代碼 眾所周知&#xff0c;ArrayList 和 LinkedList 是 Java 集合中兩個基本的數據結構&#xff0c;對應數據結構理論中的數組和鏈表。但在這兩個數據結構&#xff0c;開發者們通常使用 ArrayList&#xff0c;而不使用 LinkedList。JD…

《白帽子講 Web 安全》之開發語言安全深度解讀

目錄 引言 1.PHP 安全 1.1變量覆蓋 1.2空字節問題 1.3弱類型 1.4反序列化 1.5安全配置 2Java 安全 2.1Security Manager 2.2反射 2.3反序列化 3Python 安全 3.1反序列化 3.2代碼保護 4.JavaScript 安全 4.1第三方 JavaScript 資源 4.2JavaScript 框架 5.Node.…

鴻蒙HarmonyOS NEXT應用崩潰分析及修復

鴻蒙HarmonyOS NEXT應用崩潰分析及修復 如何保證應用的健壯性&#xff0c;其中一個指標就是看崩潰率&#xff0c;如何降低崩潰率&#xff0c;就需要知道存在哪些崩潰&#xff0c;然后對癥下藥&#xff0c;解決崩潰。那么鴻蒙應用中存在哪些崩潰類型呢&#xff1f;又改如何解決…

分析K8S中Node狀態為`NotReady`問題

在Kubernetes&#xff08;k8s&#xff09;集群中&#xff0c;Node狀態為NotReady通常意味著節點上存在某些問題&#xff0c;下面為你分析正常情況下節點應運行的容器以及解決NotReady狀態的方法。 正常情況下Node節點應運行的容器 1. kubelet kubelet是節點上的核心組件&…

第六屆機電一體化技術與智能制造國際學術會議(ICMTIM 2025)

重要信息 4月11-13日 南京江北新區工業大學亞朵酒店 www.icmtim.org&#xff08;點擊了解參會投稿等&#xff09; 簡介 由南京工業大學主辦&#xff0c;南京工業大學電氣工程與控制科學學院、中國礦業大學、黑龍江大學、江蘇省自動化學會承辦的第六屆機電一體化技術…

INT202 Complexity of Algroithms 算法的復雜度 Pt.2 Search Algorithm 搜索算法

文章目錄 1.樹的數據結構1.1 有序數據(Ordered Data)1.1.1 有序字典&#xff08;Ordered Dictonary&#xff09;1.1.1.1 排序表&#xff08;Sorted Tables&#xff09; 1.2 二分查找&#xff08;Binary Search&#xff09;1.2.1 二分查找的時間復雜度 1.3 二叉搜索樹&#xff0…

【AVRCP】藍牙鏈路控制器(LC)與AVRCP互操作性要求深度解析

目錄 一 、Link Controller&#xff08;LC&#xff09;概述 1.1 LC的定義與功能 1.2 LC在藍牙技術中的重要性 二、Link Controller&#xff08;LC&#xff09;互操作性要求 2.1 互操作性要求概述 2.2 物理層互操作性要求 2.3 鏈路管理互操作性要求 2.4 其他互操作性要求…

高級背景摳圖工具(python)

這是一個專業的圖像背景處理工具,基于Python開發,主要功能包括:1. 智能背景去除 - 使用rembg庫的深度學習模型自動識別并移除圖片背景。 2. 背景自定義 - 支持純色背景替換,保留透明通道(Alpha通道)。3. 高級參數調節 - 提供5種專業級圖像處理參數。4. 實時預覽 - 雙窗口…

如何設計外貿郵件開發信主題

開發信是打開客戶大門的第一步&#xff0c;而郵件主題則是決定客戶是否打開郵件的關鍵。一個吸引人的主題不僅能提高打開率&#xff0c;還能為后續溝通打下良好基礎。 一、突出價值和利益 郵件主題要直接傳達收件人能從中獲得的價值和利益&#xff0c;引起他們的興趣和關注。…

wordpress表單插件CF7調用方式

Contact Form 7(CF7)是WordPress中非常流行的表單插件&#xff0c;以下是其常見的調用方式&#xff1a; 通過短代碼調用 在頁面或文章編輯器中添加&#xff1a;完成表單設置后&#xff0c;復制表單對應的短代碼&#xff0c;然后在需要顯示表單的頁面或文章的編輯器中直接粘貼…

快速入手-基于Django的主子表間操作mysql(五)

1、如果該表中存在外鍵&#xff0c;結合實際業務情況&#xff0c;那可以這么寫&#xff1a; 2、針對特殊的字典類型&#xff0c;可以這么定義 3、獲取元組中的字典值和子表中的value值方法 4、對應的前端頁面寫法