哈希表-set、map

當需要判斷一個元素是否在集合中時,就使用哈希法

?散列表Hash table,也叫哈希表),是根據鍵(Key)而直接訪問在內存存儲位置的數據結構。

哈希表中關鍵碼就是數組的索引下標,然后通過下標直接訪問數組中的元素,復雜度O(1)

哈希表本質上是個數組,實現哈希表我們可以采用兩種方法:

1、數組+鏈表

2、數組+二叉樹

哈希函數

類似一個函數似的,給你一個值,經過某些加工得到另外一個值,就像這里的給你個人名,經過些許加工我們拿到首字母,那么這個函數或者是這個方法在哈希表中就叫做散列函數,其中規定的一些操作就叫做函數法則?

鍵值對,在jdk中就叫Entry

拉鏈法

剛剛小李和小王在索引1的位置發生了沖突,發生沖突的元素都被存儲在鏈表中。 這樣我們就可以通過索引找到小李和小王了

其實拉鏈法就是要選擇適當的哈希表的大小,這樣既不會因為數組空值而浪費大量內存,也不會因為鏈表太長而在查找上浪費太多時間。?

線性探測法

使用線性探測法,一定要保證tableSize大于dataSize。 我們需要依靠哈希表中的空位來解決碰撞問題。

例如沖突的位置,放了小李,那么就向下找一個空位放置小王的信息。

set

集合底層實現是否有序數值是否可以重復能否更改數值查詢效率增刪效率
std::set紅黑樹有序O(log n)O(log n)
std::multiset紅黑樹有序O(logn)O(logn)
std::unordered_set哈希表無序O(1)O(1)

std::unordered_set底層實現為哈希表,std::set 和std::multiset 的底層實現是紅黑樹,紅黑樹是一種平衡二叉搜索樹,所以key值是有序的,但key不可以修改,改動key值會導致整棵樹的錯亂,所以只能刪除和增加。

set會自動將元素排序,默認升序排列

	set<int> s;s.insert(1);s.insert(0);s.insert(3);s.insert(3);s.insert(4);s.insert(7);for (int c : s) {cout << c << "";}for (set<int>::iterator it = s.begin(); it != s.end();it++) {cout << *it << endl;}for (set<int>::iterator it = --s.end(); it != --s.begin(); it--) {cout << *it << ' ';}//反向迭代器for (set<int>::reverse_iterator it = s.rbegin(); it != s.rend();it++) {cout << *it << endl;}

map?

映射底層實現是否有序數值是否可以重復能否更改數值查詢效率增刪效率
std::map紅黑樹key有序key不可重復key不可修改O(logn)O(logn)
std::multimap紅黑樹key有序key可重復key不可修改O(log n)O(log n)
std::unordered_map哈希表key無序key不可重復key不可修改O(1)O(1)

std::unordered_map 底層實現為哈希表,std::map 和std::multimap 的底層實現是紅黑樹。同理,std::map 和std::multimap 的key也是有序的

?紅黑樹(Red Black Tree)也叫RB樹

(1)為何map和set的插入刪除效率比用其他序列容器高?

大部分人說,很簡單,因為對于關聯容器來說,不需要做內存拷貝和內存移動。說對了,確實如此。set容器內所有元素都是以節點的方式來存儲,其節點結構和鏈表差不多,指向父節點和子節點。結構圖可能如下:

  A
 ? / \
  B C
 / \ / \
? D E F G

因此插入的時候只需要稍做變換,把節點的指針指向新的節點就可以了。刪除的時候類似,稍做變換后把指向刪除節點的指針指向其他節點也OK了。這里的一切操作就是指針換來換去,和內存移動沒有關系。

(2)為何每次insert之后,以前保存的iterator不會失效?

iterator這里就相當于指向節點的指針,內存沒有變,指向內存的指針怎么會失效呢(當然被刪除的那個元素本身已經失效了)。相對于vector來說,每一次刪除和插入,指針都有可能失效,調用push_back在尾部插入也是如此。因為為了保證內部數據的連續存放,iterator指向的那塊內存在刪除和插入過程中可能已經被其他內存覆蓋或者內存已經被釋放了。即使時push_back的時候,容器內部空間可能不夠,需要一塊新的更大的內存,只有把以前的內存釋放,申請新的更大的內存,復制已有的數據元素到新的內存,最后把需要插入的元素放到最后,那么以前的內存指針自然就不可用了。特別時在和find等算法在一起使用的時候,牢記這個原則:不要使用過期的iterator。

(3)當數據元素增多時,set的插入和搜索速度變化如何?

如果你知道log2的關系你應該就徹底了解這個答案。在set中查找是使用二分查找,也就是說,如果有16個元素,最多需要比較4次就能找到結果,有32個元素,最多比較5次。那么有10000個呢?最多比較的次數為log10000,最多為14次,如果是20000個元素呢?最多不過15次。看見了吧,當數據量增大一倍的時候,搜索次數只不過多了1次,多了1/14的搜索時間而已。你明白這個道理后,就可以安心往里面放入元素了。

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

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

相關文章

Web框架Flask

Web框架Flask Flask簡介第一個Flask應用Flask路由Flask路由變量規則Flask URL 構建Flask重定向Flask靜態文件Flask渲染模板Flask請求對象Flask響應對象Flask CookiesFlask錯誤Flask JSON 格式的 APIFlask SessionFlask 消息閃現Flask日志Flask藍圖Flask視圖Flask Jinja2 模板F…

微信消息提醒

有時候同事沒有打開微信&#xff0c;重要的信息可以設置提醒

app小程序開發的重點在哪里?|企業軟件定制網站建設

app小程序開發的重點在哪里&#xff1f;|企業軟件定制網站建設 App小程序定制開發是近年來快速發展的一項技術服務&#xff0c;隨著移動互聯網的普及和用戶需求的不斷升級&#xff0c;越來越多的企業和個人開始關注和需求定制化的小程序開發。那么&#xff0c;對于app小程序定制…

Springboot_文件下載功能(前端后端)

遇到的問題&#xff1a; 文件下載后文件一直被破壞&#xff0c;無法正常打開文件名亂碼&#xff0c;如圖 剛開始一直在糾結&#xff0c;是不是后端沒有寫對&#xff0c;然后導致下載不能使用 后來搜索了一些資料&#xff0c;發現后端沒什么問題 然后就開始找到其他項目對比…

頭發的方向圖(2D和3D)與合成

首先&#xff0c;我們從一個不受光照限制的環境中拍攝一組輸入圖像&#xff0c;這些圖像包含了頭發的不同視角和姿態。我們對這些圖像進行半自動的分割&#xff0c;將頭發從背景中分離出來&#xff0c;然后使用PMVS &#xff0c;一種先進的多視角立體算法&#xff0c;來重建一個…

Qt 問題 判斷QTreeWidget的子節點的父節點是否可見

bool JudgeParentItemVisible(QTreeWidgetItem * pLayerItem) {bool bVisible true;QTreeWidgetItem * pParentItem (QTreeWidgetItem *)pLayerItem->parent(); //獲取父節點if (pParentItem ! NULL) //父節點不為空{if (pParentItem->checkState(0) Qt::CheckState::…

廣播組播、本地套接字通信、wireshark、以太網幀格式、三次握手四次揮手

廣播&#xff08;使用 UDP 套接字&#xff09; 廣播地址&#xff1a;主機號最大的地址。 廣播&#xff1a;給所在局域網的所有主機發送數據報。&#xff08;之前的數據報發送方式是單播。&#xff09; 以下情況中使用廣播&#xff1a; 局域網 搜索協議。 比如家中的智能產品&a…

局域網共享打印機共享,簡單至簡至一鍵處理011bDll等問題

一、電腦系統是否激活&#xff08;可選&#xff09; 二、確保主客戶端PC在同一局域網內&#xff08;可選&#xff09; 可以通過ping 目標地址 如ping 192.168.1.202&#xff1b;看是否可以正常通信 下面是惠普類型打印機共享問題關鍵&#xff08;文本記得保存&#xff09; …

Redisson 分布式鎖的最佳實踐

Redisson 分布式鎖的最佳實踐 第一、添加依賴第二、添加redisson配置類第三、添加測試類測試結果擴展知識redisson鎖中lock方法和tryLock方法有什么區別鎖續約 注意事項 引言 在現代分布式系統中&#xff0c;處理并發問題是至關重要的。分布式鎖是解決這類問題的關鍵工具之一。…

雙11再創新高!家電行業如何通過矩陣管理,賦能品牌增長?

雙11大促已落下帷幕&#xff0c;雖然今年不再戰報滿天飛&#xff0c;但從公布的數據來看&#xff0c;家電行業整體表現不俗。 根據抖音電商品牌業務發布的收官戰報&#xff0c;家電行業創造了成交新紀錄&#xff0c;整體同比增長125%。快手官方數據顯示&#xff0c;消電家居行業…

深入理解JMM以及并發三大特性(1)

文章目錄 1. 并發與并行2. JMM3. 并發三大特性4.總結 1. 并發與并行 并行&#xff1a;指在同一時刻&#xff0c;有多條指令在多個處理器上同時執行。所以無論從微觀還是宏觀來看&#xff0c;二者都是一起執行的。 并發&#xff1a;指在同一時刻只能有一個指令執行&#xff0c;…

基于springboot實現校園在線拍賣系統項目【項目源碼】

基于springboot實現校園在線拍賣系統演示 Javar技術 JavaScript是一種網絡腳本語言&#xff0c;廣泛運用于web應用開發&#xff0c;可以用來添加網頁的格式動態效果&#xff0c;該語言不用進行預編譯就直接運行&#xff0c;可以直接嵌入HTML語言中&#xff0c;寫成js語言&…

java開發中各個環境的適用場景

java開發中各個環境的適用場景 一.開發環境 在系統開發的經典模型&#xff0c;一般會分成 2 類 5 種環境&#xff1a; 【線下】本地環境(local)、開發環境(dev)、測試環境(test) 【線上】預發布環境(stage)、生產環境(prod) 每個環境、每個項目使用獨立的二級域名 線下、線…

Modbus轉Profinet改變局面,PLC與電力儀表秒級響應

Modbus轉Profinet改變了傳統的局面&#xff0c;實現了PLC與電力儀表之間的秒級響應。在過去&#xff0c;由于Modbus通信協議的限制&#xff0c;PLC與電力儀表之間的數據傳輸速度受到了很大的限制&#xff0c;無法滿足工業自動化領域對實時性的要求。然而&#xff0c;隨著Modbus…

【云原生 Prometheus篇】Prometheus架構詳解與核心組件的應用實例(Exporters、Grafana...)

Prometheus Part1 一、常用的監控系統1.1 簡介1.2 Prometheus和zabbix的區別 二、Prometheus2.1 簡介2.2 Prometheus的主要組件1&#xff09;Prometheus server2&#xff09;Exporters3&#xff09;Alertmanager4&#xff09;Pushgateway5&#xff09;Grafana 2.3 Prometheus的…

openGauss學習筆記-130 openGauss 數據庫管理-參數設置-重設參數

文章目錄 openGauss學習筆記-130 openGauss 數據庫管理-參數設置-重設參數130.1 背景信息130.2 GUC參數設置130.3 操作步驟130.4 示例 openGauss學習筆記-130 openGauss 數據庫管理-參數設置-重設參數 130.1 背景信息 openGauss提供了多種修改GUC參數的方法&#xff0c;用戶可…

【網絡】數據鏈路層協議

數據鏈路層協議 一、鏈路層解決的問題二、以太網協議1、局域網技術2、令牌環網&#xff08;了解&#xff09;3、以太網通信原理4、 MAC地址5、以太網幀格式6、碰撞避免7、最大傳輸單元MTU 二、ARP協議1、ARP數據的格式2、ARP協議的工作流程3、ARP緩存表4、ARP協議中的一些問題7…

11月23日星期四今日早報簡報微語報早讀

11月23日星期四&#xff0c;農歷十月十一&#xff0c;早報微語早讀。 1、我國5G基站總數達321.5萬個&#xff1b; 2、2023年兩院院士增選結果揭曉&#xff0c;共133人當選&#xff1b; 3、北京低保標準提升至每人每月1395元&#xff1b; 4、上海制定體育發展條例&#xff1a…

多重背包問題的優化 學習筆記 AcWing 5. 多重背包問題 II(算法基礎課)

乘法原理 百度百科 乘法原理是說把多個步驟的所有方法相乘&#xff0c;表示整個事件所有可能的解決方法 原題 有 N&#xfffd; 種物品和一個容量是 V&#xfffd; 的背包。 第 i&#xfffd; 種物品最多有 si&#xfffd;&#xfffd; 件&#xff0c;每件體積是 vi&#…

程序員必讀!深入解析Java線程調度算法神秘面紗!

哈嘍大家好&#xff0c;我是小米&#xff01;今天我們要聊的話題是關于Java中的線程調度算法。這可是一個技術大拿們在面試時常常拿出來考察我們的點子呢&#xff01;廢話不多說&#xff0c;讓我們一起深入了解一下吧&#xff01; 線程調度算法的背后 首先&#xff0c;讓我們…