數據結構 Map和Set

文章目錄

    • 📕1. 二叉搜索樹
        • ??1.1 查找操作
        • ??1.2 插入操作
        • ??1.3 刪除操作
    • 📕2. Map的使用
        • ??2.1 Map的常用方法
        • ??2.2 TreeMap和HashMap的區別
        • ??2.3 HashMap的底層實現
    • 📕3. Set的使用
        • ??3.1 Set的常用方法
        • ??3.2 TreeSet和HashSet的區別
    • 📕4. 哈希表
        • ??4.1 哈希表沖突
        • ??4.2 避免哈希表沖突
        • ??4.3 解決哈希表沖突
            • 📏4.3.1 開放地址法
            • 📏4.3.2 拉鏈法

📕1. 二叉搜索樹

二叉搜索樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:

  1. 若它的左子樹不為空,則左子樹上所有節點的值都小于根節點的值
  2. 若它的右子樹不為空,則右子樹上所有節點的值都大于根節點的值
  3. 它的左右子樹也分別為二叉搜索樹
??1.1 查找操作

在這里插入圖片描述

    //搜索public TreeNode search(int value){TreeNode cur = root;while(cur!=null){if(value<cur.value){cur = cur.left;}else if(value>cur.value){cur = cur.right;} else if (value == cur.value) {return cur;}}return null;}
??1.2 插入操作

在這里插入圖片描述

//插入public boolean insert(int value){TreeNode treeNode = new TreeNode(value);if (root==null){root = treeNode;return true;}TreeNode cur = root;TreeNode parent = null;while (cur!=null){if (value>cur.value){parent = cur;cur = cur.right;} else if (value<cur.value) {parent = cur;cur = cur.left;}else if (value==cur.value){return false;}}//整體思路是先找到要插入節點的父節點,比父節點的值大就插入到父節點的右邊,反之插入到父節點的左邊if (value>parent.value){parent.right = treeNode;}else {parent.left = treeNode;}return true;}
??1.3 刪除操作

待補充!!!

📕2. Map的使用

Map是?個接?,可以有HashMap實現或者TreeMap實現,該類沒有繼承?Collection,該類中存儲的是<K,V>結構的鍵值對,并且K?定是唯?的,不能重復。

Map.Entry<K, V> 是Map內部實現的?來存放<key, value>鍵值對映射關系的內部類,該內部類中主要提供了<key, value>的獲取,value的設置以及Key的?較?式。Map.Entry<K,V>并沒有提供設置Key的?法

在這里插入圖片描述

??2.1 Map的常用方法

在這里插入圖片描述
💡💡💡注意:

  1. Map是?個接?,不能直接實例化對象,如果要實例化對象只能實例化其實現類TreeMap或者HashMap
  2. Map中存放鍵值對的Key是唯?的,value是可以重復的
  3. TreeMap中插?鍵值對時,key不能為空,否則就會拋NullPointerException異常,value可以為空。但是HashMap的key和value都可以為空。
  4. Map中的Key可以全部分離出來,存儲到Set中來進?訪問(因為Key不能重復)
  5. Map中的value可以全部分離出來,存儲在Collection的任何?個?集合中(value可能有重復)
  6. Map中鍵值對的Key不能直接修改,value可以修改,如果要修改key,只能先將該key刪除掉,然
    后再來進?重新插?
??2.2 TreeMap和HashMap的區別

在這里插入圖片描述

??2.3 HashMap的底層實現
  1. JDK1.8 之前

JDK1.8 之前 HashMap 底層是 數組和鏈表 結合在一起使用也就是 鏈表散列。

  1. JDK1.8 之后

相比于之前的版本, JDK1.8 之后在解決哈希沖突時有了較大的變化,當鏈表長度大于閾值(默認為 8)(將鏈表轉換成紅黑樹前會判斷,如果當前數組的長度小于 64,那么會選擇先進行數組擴容,而不是轉換為紅黑樹)時,將鏈表轉化為紅黑樹。這樣做的目的是減少搜索時間:鏈表的查詢效率為 O(n)(n 是鏈表的長度),紅黑樹是一種自平衡二叉搜索樹,其查詢效率為 O(log n)。當鏈表較短時,O(n) 和 O(log n) 的性能差異不明顯。但當鏈表變長時,查詢性能會顯著下降。

為什么優先擴容而非直接轉為紅黑樹?

數組擴容能減少哈希沖突的發生概率(即將元素重新分散到新的、更大的數組中),這在多數情況下比直接轉換為紅黑樹更高效。紅黑樹需要保持自平衡,維護成本較高。并且,過早引入紅黑樹反而會增加復雜度。

為什么選擇閾值 8 和 64?

  1. 泊松分布表明,鏈表長度達到 8 的概率極低(小于千萬分之一)。在絕大多數情況下,鏈表長度都不會超過 8。閾值設置為 8,可以保證性能和空間效率的平衡。
  2. 數組長度閾值 64 同樣是經過實踐驗證的經驗值。在小數組中擴容成本低,優先擴容可以避免過早引入紅黑樹。數組大小達到 64 時,沖突概率較高,此時紅黑樹的性能優勢開始顯現。

📕3. Set的使用

Set與Map主要的不同有兩點:Set是繼承?Collection的接?類,Set中只存儲了Key

??3.1 Set的常用方法

在這里插入圖片描述

💡💡💡注意:

  1. Set是繼承?Collection的?個接?
  2. Set中只存儲了key,并且要求key?定要唯一
  3. TreeSet的底層是使?Map來實現的,其使?key與Object的?個默認對象作為鍵值對插?到Map中的
  4. Set最?的功能就是對集合中的元素進?去重
  5. 實現Set接?的常?類有TreeSet和HashSet
  6. Set中的Key不能修改,如果要修改,先將原來的刪除掉,然后再重新插?
  7. reeSet中不能插?null的key,HashSet可以
??3.2 TreeSet和HashSet的區別

在這里插入圖片描述

📕4. 哈希表

哈希表(Hash table),又稱為散列表,是一種根據關鍵碼值(Key value)直接進行訪問的數據結構。它通過將關鍵碼值映射到表中的一個位置來訪問記錄,從而加快查找的速度。這個映射函數稱為散列函數,存放記錄的數組稱為散列表。

例如:
數據集合{1,7,6,4,5,9};
哈希函數設置為:hash(key) = key % capacity; capacity為存儲元素底層空間總的??
在這里插入圖片描述

?該?法進?搜索不必進?多次關鍵碼的?較,因此搜索的速度?較快

??4.1 哈希表沖突

對于兩個數據元素的關鍵字 ki 和 kj(i != j),有 i != j ,但有:Hash( ki ) == Hash( kj ),

即:不同關鍵字通過相同哈希函數計算出相同的哈希地址,該種現象稱為哈希沖突或哈希碰撞。

把具有不同關鍵碼?具有相同哈希地址的數據元素稱為“同義詞”。

??4.2 避免哈希表沖突

?先,我們需要明確?點,由于我們哈希表底層數組的容量往往是?于實際要存儲的關鍵字的數量的,這就導致?個問題,沖突的發?是必然的,但我們能做的應該是盡量的降低沖突率。

  1. 🌈設計哈希函數

引起哈希沖突的?個原因可能是:哈希函數設計不夠合理。常見的哈希函數有:

  1. 直接定制法(常用)
    取關鍵字的某個線性函數為散列地址:Hash(Key)= A*Key + B優點:簡單、均勻缺點:需
    要事先知道關鍵字的分布情況使?場景:適合查找?較?且連續的情況
  2. 除留余數法(常用)
    設散列表中允許的地址數為m,取?個不?于m,但最接近或者等于m的質數p作為除數,按
    照哈希函數:Hash(key) = key% p(p<=m),將關鍵碼轉換成哈希地址
  3. 平方取中法(了解)
  4. 折疊法(了解)
  5. 隨機數法(了解)
  6. 數學分析法(了解)
  1. 🌈調節負載因子

在這里插入圖片描述

在這里插入圖片描述
所以當沖突率達到?個?法忍受的程度時,我們需要通過降低負載因?來變相的降低沖突率

已知哈希表中已有的關鍵字個數是不可變的,那我們能調整的就只有哈希表中的數組的??

??4.3 解決哈希表沖突

解決哈希沖突兩種常?的?法是:開放地址法和拉鏈法

📏4.3.1 開放地址法

開放地址法 :當發?哈希沖突時,如果哈希表未被裝滿,說明在哈希表中必然還有空位置,那么可以把key存放到沖突位置中的“下?個” 空位置中去。那如何尋找下?個空位置呢?

  1. 🌈線性探測

?如上?的場景,現在需要插?元素44,先通過哈希函數計算哈希地址,下標為4,因此44理論上應該插在該位置,但是該位置已經放了值為4的元素,即發?哈希沖突。

線性探測:從發?沖突的位置開始,依次向后探測,直到尋找到下?個空位置為?。

在這里插入圖片描述

采?閉散列處理哈希沖突時,不能隨便物理刪除哈希表中已有的元素,若直接刪除元素會影響其他元素的搜索。?如刪除元素4,如果直接刪除掉,44查找起來可能會受影響。因此線性探測采?標記的偽刪除法來刪除?個元素。

  1. 🌈二次探測

線性探測的缺陷是產?沖突的數據堆積在?塊,這與其找下?個空位置有關系,因為找空位置的?式就是挨著往后逐個去找,因此?次探測為了避免該問題,找下?個空位置的?法為: Hi = ( H0 +(-) i^2 )% m ),其中:i = 1,2,3…, 是通過散列函數Hash(x)對元素的關鍵碼key 進?計算得到的位置,m是表的??。對于2.1中如果要插?44,產?沖突,使?解決后的情況為:
在這里插入圖片描述

📏4.3.2 拉鏈法

開散列法?叫鏈地址法(開鏈法),?先對關鍵碼集合?散列函數計算散列地址,具有相同地址的關鍵碼歸于同??集合,每?個?集合稱為?個桶,各個桶中的元素通過?個單鏈表鏈接起來,各鏈表的頭結點存儲在哈希表中。
在這里插入圖片描述
從上圖可以看出,開散列中每個桶中放的都是發?哈希沖突的元素。

拉鏈法,可以認為是把?個在?集合中的搜索問題轉化為在?集合中做搜索了。

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

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

相關文章

樹莓派5-系統 Debian 12 開啟VNC遠程訪問踩坑記錄

簡單記錄一下踩坑&#xff0c;安裝vnc遠程訪問服務并設置開機自啟1.查看系統版本&#xff0c;我這里的系統版本是 12cat /etc/os-release2.安裝VNC服務sudo apt install realvnc-vnc-server realvnc-vnc-viewer -y3.創建服務單元文件&#xff1a;sudo nano /etc/systemd/system…

TASK2 夏令營:用AI做帶貨視頻評論分析

TASK2 夏令營&#xff1a;用AI做帶貨視頻評論分析**電商評論洞察賽題&#xff1a;從Baseline到LLM進階優化學習筆記**一、 賽題核心解讀1.1. 任務鏈條與目標1.2. 關鍵挑戰與評分機制二、 Baseline方案回顧與瓶頸分析2.1. Baseline技術棧2.2. 核心瓶頸三、 進階優化策略&#xf…

Docker:安裝命令筆記

目錄 零、安裝&#xff1a;略 一、鏡像 1.0、獲取鏡像&#xff1a; 1.1、查看鏡像&#xff1a; 1.2、刪除鏡像&#xff1a; 二、容器 2.0、創建并啟動容器 2.1、tomcat和jdk9的“創建并啟動容器”的命令 2.2、容器操作 2.3、容器日志操作 零、安裝&#xff1a;略 略 …

Python七彩花朵

系列文章 序號直達鏈接Tkinter1Python李峋同款可寫字版跳動的愛心2Python跳動的雙愛心3Python藍色跳動的愛心4Python動漫煙花5Python粒子煙花Turtle1Python滿屏飄字2Python藍色流星雨3Python金色流星雨4Python漂浮愛心5Python愛心光波①6Python愛心光波②7Python滿天繁星8Pytho…

【保姆級圖文詳解】MCP架構(客戶端-服務端)、三種方式使用MCP服務、Spring AI MCP客戶端和服務端開發、MCP部署方案、MCP安全性

文章目錄前言一、MCP(model context protocol)1.1、概念描述1.2、MCP作用與意義1.3、MCP架構二、使用MCP(model context protocol)2.1、云平臺使用MCP2.2、軟件客戶端使用MCP2.3、Spring AI程序中使用MCP三、Spring AI MCP(model context protocol)開發過程3.1、MCP服務端開發3…

Linux的 iproute2 配置:以太網(Ethernet)、綁定(Bond)、虛擬局域網(VLAN)、網橋(Bridge)筆記250713

Linux的 iproute2 配置:以太網(Ethernet)、綁定(Bond)、虛擬局域網(VLAN)、網橋(Bridge&#xff09;筆記250713 在 Linux 中使用 iproute2 工具集配置網絡是現代且推薦的方法&#xff0c;它取代了舊的 ifconfig、route、brctl、vconfig 等命令。iproute2 提供了統一的接口 ip …

當信任上鏈解碼區塊鏈溯源系統開發邏輯與產業變革

當信任上鏈&#xff1a;解碼區塊鏈溯源系統的開發邏輯與產業變革在上海某高端超市的進口水果區&#xff0c;消費者王女士拿起一盒車厘子&#xff0c;用手機掃描包裝上的二維碼&#xff0c;屏幕立刻彈出一串動態信息&#xff1a;智利瓦爾帕萊索港口的裝船時間、海關清關的具體日…

可視化DIY小程序工具!開源拖拽式源碼系統,自由搭建,完整的源代碼包分享

溫馨提示&#xff1a;文末有資源獲取方式傳統的小程序開發對技術要求較高&#xff0c;這使得許多非技術人員望而卻步。可視化DIY小程序工具應運而生&#xff0c;它通過拖拽式操作和開源代碼系統&#xff0c;極大地降低了開發門檻&#xff0c;讓更多人能夠快速構建個性化小程序。…

【MLLM】多模態理解GLM-4.1V-Thinking模型

note GLM-4.1V-Thinking模型引入 課程采樣強化學習&#xff08;RLCS, Reinforcement Learning with Curriculum Sampling&#xff09; 策略&#xff0c;在多個復雜推理任務中實現能力突破&#xff0c;整體性能達到 10B 級別視覺語言模型的領先水平。GLM-4.1V-9B-Thinking 通過…

【C++詳解】STL-priority_queue使用與模擬實現,仿函數詳解

文章目錄一、priority_queue使用仿函數控制優先級sort算法里的仿函數二、手撕優先級隊列優先級隊列的容器適配器入堆出堆top/size/empty迭代器區間構造初始化(解耦)三、仿函數仿函數控制冒泡排序仿函數控制priority_queue比較邏輯仿函數使用場景仿函數的其他使用場景源碼一、pr…

在mac m1基于ollama運行deepseek r1

1 下載和安裝 在ollama的官網下載mac m1版本的ollama https://ollama.com/ 最終獲得如下所示的下載地址 https://github.com/ollama/ollama/releases/latest/download/Ollama.dmg 然后點擊安裝&#xff0c;然后測試 ollama list 2 運行deepseek r1 deepseek-r1:8b 比較適…

TCP與UDP協議詳解:網絡世界的可靠信使與高速快遞

> 互聯網的骨架由傳輸層協議支撐,而TCP與UDP如同血管中的紅細胞與血小板,各司其職卻又缺一不可 ### 一、初識傳輸層雙雄:網絡通信的基石 想象你要給朋友寄送重要文件: - **TCP** 如同順豐快遞:**簽收確認+物流追蹤**,確保文件完整送達 - **UDP** 如同普通信件:**直接…

Datawhale AI 夏令營【更新中】

Datawhale AI 夏令營【更新中】夏令營簡介大模型技術&#xff08;文本&#xff09;方向&#xff1a;用AI做帶貨視頻評論分析機器學習&#xff08;數據挖掘&#xff09;方向&#xff1a;用AI預測新增用戶夏令營簡介 本次AI夏令營是Datawhale在暑期發起的大規模AI學習活動&#…

AutoDL掛載阿里云OSS

文章目錄前言AutoDL 設置阿里OSS設置OSS配置相關key 相關競猜時間前言 最近&#xff0c;AutoDL提示北京A區網盤功能要下架&#xff0c;然后需要對網盤中數據進行轉移等操作&#xff0c;我想網盤中數據下載到本地&#xff0c;大概16G&#xff1b;直接在網盤那里下載&#xff0c…

java 基本數據類型所對應的包裝類

一,對應列舉Java 中有 8 種基本數據類型&#xff0c;每種基本數據類型都有對應的包裝類&#xff0c;它們分別是&#xff1a;二,包裝類的作用1. 滿足面向對象編程需求Java 是面向對象的編程語言&#xff0c;基本數據類型不是對象&#xff0c;無法使用面向對象的特性&#xff08;…

牛客網50題-10

1.小苯的數字權值#include <iostream> #include <algorithm> using namespace std;const int max_n 2000000; int d[max_n 1]; int f[max_n 1];int main() {for(int i 1; i<max_n;i){for(int j i; j<max_n;ji){d[j];}}for(int i1; i<max_n;i){f[i] d…

基于springboot的大學公文收發管理系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

【機器學習】反向傳播如何求梯度(公式推導)

寫在前面 前期學習深度學習的時候&#xff0c;很多概念都是一筆帶過&#xff0c;只是覺得它在一定程度上解釋得通就行&#xff0c;但是在強化學習的過程中突然意識到&#xff0c;反向傳播求梯度其實并不是一件簡單的事情&#xff0c;這篇博客的目的就是要講清楚反向傳播是如何對…

ALB、NLB、CLB 負載均衡深度剖析

ALB、NLB、CLB 負載均衡深度剖析 前言 筆者在上周的實際工作中遇到了一個典型的負載均衡選擇問題&#xff1a;在使用代理調用相關模型時&#xff0c;最初配置 Nginx 的代理地址為 ALB 的 7 層虛擬 IP&#xff08;VIP&#xff09;&#xff0c;但由于集團網絡默認的超時時間為 3 …

歷史數據分析——云南白藥

醫藥板塊走勢分析: 從月線級別來看 2008年11月到2021年2月,月線上走出了兩個震蕩中樞的月線級別2085-20349的上漲段; 2021年2月到2024年9月,月線上走出了20349-6702的下跌段; 目前月線級別放巨量,總體還在震蕩區間內,后續還有震蕩和上漲的概率。 從周線級別來看 從…