數據結構-散列表(hash table)

6.1 散列表的概念

散列表又叫哈希(hash)表,是根據鍵(key)直接訪問在內存存儲位置的值(value)的數據結構,由數組演化而來(根據數組支持按照下標進行隨機訪問數據的特性)。

eg:有一組數據2023ZHBJ001、2023ZHBJ002、...、2023ZHBJ100。其中2023代表年份,zh代表中國,bj代表北京,001代表選手編號,此時這一串數據就代表一個選手

那么此時,我們如何將這一串數據轉換為key存進數組作為數組下標呢?此時我們介紹下面這個方法散列函數。

6.2 散列函數

概念:將key映射為數組下標的函數就叫散列函數。可以表示成hashvalue=hash(key)。

散列函數的要求:

1.散列函數計算得到的key值必須是大于等于0的正整數,因為hashvalue要作為數組下標。

2.如果key1==key2,那么經過hash后得到的hash值也必須相等:hash(key1)==hash(key2)。

3.如果key1 != key2,那么經過hash后得到的hash值也必須不相等:hash(key1)!=hash(key2)。

注:第三點不太好實現,因為實際情況下想找一個散列函數能夠做到對于不同key計算得到的散列值不相同是幾乎不可能的,這就是散列沖突。

6.3 散列沖突(哈希碰撞、哈希沖突)

概念:多個key值映射到同一個數組下標,這就是散列沖突。

那么如何解決這個呢,就要介紹到下面的拉鏈法。

6.4 拉鏈法

在散列表中,數組每個下標的位置我們稱之為桶(bucket)或者槽(slot),每個桶(槽)都對應一個鏈表,所有的散列值相同的元素都存進相同槽位對應的鏈表中。這樣就做到了讓多個hash值相同的元素存到同一個索引下,這就解決了hash沖突

6.5 拉鏈法時間復雜度

6.5.1 插入

通過散列函數計算出對應散列槽位,將其插入進對應散列槽位即可,時間復雜度是O(1);

插入流程:根據key經過hash計算得到數組索引,然后將數據掛到索引上,這樣不需要遍歷,只需要計算就可完成,效率比較高,所以時間復雜度是O(1)。

6.5.2 刪除、查找

當查找、刪除時,同樣是先通過hash計算得到數組索引,然后遍歷對應槽位的鏈表進行查找刪除。

6.5.2.1 一般情況下

基于鏈表法解決沖突時查詢的時間復雜度時O(1)。因為鏈表中數據并不多

6.5.2.2 特殊情況下

當數據量夠多,產生了大量的hash沖突,就會將數據掛到同一索引下,導致某一個槽位的鏈表很長,那么此時散列表就退化成了鏈表,當再去這個索引下查找元素時,就要遍歷鏈表,所以時間復雜度為O(n)。

6.5.2.3 第三種情況下

當鏈表過長時,將鏈表法中的鏈表改造為其他高效的數據結構,比如紅黑樹,這樣遍歷時時間復雜度為O(logn)。

注:將鏈表改為紅黑樹的一個重要原因也是為了防止DDos攻擊(分布式拒絕服務攻擊)。

可以理解為,有人惡意偽造key,造成大量hash沖突,就會在數組索引中產生大量鏈表,就會導致訪問散列表的效率很低。

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

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

相關文章

windows腳本獲取 svn版本號

簡介 需要使用項目中svn的最新版本號 命令 set svnURL"URL" svn info %svnURL% | findstr "Revision:" > Version.txt for /f "token2 delims " %%i in (Version.txt) do set rev%%i echo %rev% pause

力扣爆刷第163天之TOP100五連刷81-85(回文鏈表、路徑和、最長重復子數組)

力扣爆刷第163天之TOP100五連刷81-85(回文鏈表、路徑和、最長重復子數組) 文章目錄 力扣爆刷第163天之TOP100五連刷81-85(回文鏈表、路徑和、最長重復子數組)一、234. 回文鏈表二、112. 路徑總和三、169. 多數元素四、662. 二叉樹…

洛谷 B4006 [GESP202406 四級] 寶箱

題目描述 小楊發現了 𝑛 個寶箱,其中第 𝑖 個寶箱的價值是 𝑎𝑖?。 小楊可以選擇一些寶箱放入背包并帶走,但是小楊的背包比較特殊,假設小楊選擇的寶箱中最大價值為 𝑥&#xff0c…

next input代碼嘗試編寫

使用有限狀態機(FSM)可以使代碼結構更清晰,特別是處理復雜的狀態和過渡時。以下是如何根據你提供的步驟,用有限狀態機來實現自動校準和中斷觸發邏輯的示例代碼。 狀態定義 IDLE: 空閑狀態,等待數據輸入。CALIBRATING…

Python高級(三)_正則表達式

Python高級-正則表達式 第三章 正則表達式 在開發中會有大量的字符串處理工作,其中經常會涉及到字符串格式的校驗。 1、正則表達式概述 正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、…

PostgreSql中的JSON數據類型

PostgreSQL 提供了兩種 JSON 數據類型:JSON 以及 JSONB。這兩種類型主要的區別在于數據存儲格式,JSONB 使用二進制格式存儲數據,更易于處理。 PostgreSQL 推薦優先選擇 JSONB 數據類型。 兩種數據類型之間的區別: 功能JSONJSONB存…

網絡建設與運維23國賽網絡運維正式賽題解析

競賽環境請看主頁! 23國賽網絡運維 任務描述:某集團公司在更新設備后,路由之間無法正常通信,請修 復網絡達到正常通信。 (1) 請在server1“管理員”下拉菜單中選擇“鏡像”選項卡,點 擊 “創…

超聲波眼鏡清洗機有用嗎?四大主流超聲波清洗機品牌整理測評

長期佩戴的眼鏡,若不定期清洗,不僅鏡片會逐漸積聚油脂、灰塵,影響透光率,使視物模糊,更嚴重的是,眼鏡上日益增加的微小雜質和細菌可能會逐漸影響到眼睛健康,導致視力下降、眼部疾病等問題。 這…

Go 1.19.4 函數-Day 08

1. 函數概念和調用原理 1.1 基本介紹 函數是基本的代碼塊,用于執行一個任務。 Go 語言最少有個 main() 函數。 你可以通過函數來劃分不同功能,邏輯上每個函數執行的是指定的任務。 函數聲明告訴了編譯器函數的名稱,返回類型,和參…

STM32 - PWR 筆記

PWR(Power Control)電源控制 PWR 負責管理 STM32 內部的電源供電部分,可以實現 可編程電壓監測器 和 低功耗模式 的功能 可編程電壓監測器(PVD)可以監控VDD電源電壓,當VDD下降到PVD閥值以下或上升到PVD…

usbserver工程師手記(三)手工開通 OTP功能

1、設定密鑰,用戶自行選擇一個密鑰,以下以密鑰為 EAZAYOKNGETBOPC5 為例說明 2、usb server 配置otp 密鑰,目前還沒有UI 界面開通,后續版本會支持從管理界面開通 curl -X POST -H Content-Type: application/json -H Accept: app…

關于transformers庫驗證時不進入compute_metrics方法的一些坑

生成式任務輸入就是標簽 transformers在進入compute_metrics前會有一個判斷,源碼如下: # 版本 transformers4.41.2 # 在trainer.py 的 3842 行 # Metrics! if (self.compute_metrics is not Noneand all_preds is not Noneand all_labels is not Nonea…

Centos7下zabbix安裝與部署

Centos7下zabbix安裝與部署 一、Zabbix介紹 1、zabbix是一個基于WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案 2、zabbix能監視各種網絡參數,保證服務器系統的安全運營;并提供靈活的通知機制以讓系統管理員快速定位/解決存在的各…

活動策劃秘籍:如何讓企業活動引爆市場?

作為一個活動策劃,我的經驗是,活動策劃是一場精心編排的交響樂,每一個音符都要恰到好處。 想要做好企業活動策劃工作的關鍵在于綜合考慮多個方面,并確保每個環節的順暢執行。 以下是7個關鍵要素,只要用心體會&#x…

學習小記-使用Redis的令牌桶算法實現分布式限流

在介紹令牌桶算法前先介紹一下漏桶算法(Leaky Bucket) 漏桶算法(Leaky Bucket) 漏桶算法是一種固定容量的容器模型,它通過控制數據流入和流出的速度來限制數據的傳輸速率。漏桶算法的主要特點包括: 固定…

鴻蒙開發:Universal Keystore Kit(密鑰管理服務)【密鑰派生(C/C++)】

密鑰派生(C/C) 以HKDF256密鑰為例,完成密鑰派生。具體的場景介紹及支持的算法規格,請參考[密鑰生成支持的算法]。 在CMake腳本中鏈接相關動態庫 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)開發步驟 生成密鑰 指定密鑰別名。 初始化密鑰屬…

通過電壓差判定無源晶振是否起振正確嗎?

在電子工程中,無源晶振作為許多數字電路的基礎組件,其是否成功起振對于系統的正常運行至關重要。然而,通過簡單檢測晶振兩端的電壓差來判斷晶振是否工作,這一方法存在一定的誤區,晶發電子將深入探討這一話題&#xff0…

2008年下半年軟件設計師【下午題】真題及答案

文章目錄 2008年下半年軟件設計師下午題--真題2008年下半年軟件設計師下午題--答案 2008年下半年軟件設計師下午題–真題 2008年下半年軟件設計師下午題–答案

四川赤橙宏海商務信息咨詢有限公司抖音電商服務靠譜嗎?

在數字化浪潮席卷全球的今天,電商行業蓬勃發展,各種新興電商平臺層出不窮。其中,抖音電商以其獨特的社交屬性和龐大的用戶基礎,迅速崛起為行業新星。四川赤橙宏海商務信息咨詢有限公司,作為專注于抖音電商服務的佼佼者…

個人怎么交易現貨黃金:加速形態

我們作為普通個人,在現貨黃金市場中交易就需要掌握相應的現貨黃金投資技巧。下面我們就來介紹一個,個人怎么交易現貨黃金的形態——加速形態。 加速形態是用于判斷市場趨勢力竭的情況,這種趨勢可以是上升,也可以是下跌。但是要注意…