1. 程式人生 > >hash與map的區別聯絡應用

hash與map的區別聯絡應用

一,hashtable原理:

雜湊表又名散列表,其主要目的是用於解決資料的快速定位問題。考慮如下一個場景。

一列鍵值對資料,儲存在一個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我一個個拿出來比較key啊,呵呵。

大家都知道,在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的陣列空間,就不需要一個個查詢。而雜湊表就是利用陣列這個能夠快速定位資料的結構解決以上的問題的。

具體如何做呢?大家是否有注意到前面說的話:“陣列可以通過下標直接定位到相應的空間”,對就是這句,雜湊表的做法其實很簡單,就是把Key通過一 個固定的演算法函式既所謂的雜湊函式轉換成一個整型數字,然後就將該數字對陣列長度進行取餘,取餘結果就當作陣列的下標,將value儲存在以該數字為下標 的陣列空間裡,而當使用雜湊表進行查詢的時候,就是再次使用雜湊函式將key轉換為對應的陣列下標,並定位到該空間獲取value,如此一來,就可以充分 利用到陣列的定位效能進行資料定位。

不知道說到這裡,一些不瞭解的朋友是否大概瞭解了雜湊表的原理,其實就是通過空間換取時間的做法。到這裡,可能有的朋友就會問,雜湊函式對key進 行轉換,取餘的值一定是唯一的嗎?這個當然不能保證,主要是由於hashcode會對陣列長度進行取餘,因此其結果由於陣列長度的限制必然會出現重複,所 以就會有“衝突”這一問題,至於解決衝突的辦法其實有很多種,比如重複雜湊的方式,大概就是定位的空間已經存在value且key不同的話就重新進行雜湊 加一併求模陣列元素個數,既 (h(k)+i) mod S , i=1,2,3…… ,直到找到空間為止。還有其他的方式大家如果有興趣的話可以自己找找資料看看。

2 hash_map和map的區別在哪裡?
建構函式。hash_map需要hash函式,等於函式;map只需要比較函式(小於函式).
儲存結構。hash_map採用hash表儲存,map一般採用紅黑樹(RB Tree)實現。因此其memory資料結構是不一樣的。
3 什麼時候需要用hash_map,什麼時候需要用map?
總 體來說,hash_map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別;而map的查詢速度是log(n)級別。並不一定常數就比log(n) 小,hash還有hash函式的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map。但若你對記憶體使用特別嚴格, 希望程式儘可能少消耗記憶體,那麼一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map物件特別多時,你就更無法控制了,而且 hash_map的構造速度較慢。
現在知道如何選擇了嗎?權衡三個因素: 查詢速度, 資料量, 記憶體使用。

4 map基本原理介紹:

用過map吧?map提供一個很常用的功能,那就是提供key-value的儲存和查詢功能。例如,我要記錄一個人名和相應的儲存,而且隨時增加,要快速查詢和修改:

嶽不群-華山派掌門人,人稱君子劍
張三丰-武當掌門人,太極拳創始人
東方不敗-第一高手,葵花寶典
...
這些資訊如果儲存下來並不複雜,但是找起來比較麻煩。例如我要找"張三丰"的資訊,最傻的方法就是取得所有的記錄,然後按 照名字一個一個比較。如果要速度快,就需要把這些記錄按照字母順序排列,然後按照二分法查詢。但是增加記錄的時候同時需要保持記錄有序,因此需要插入排 序。考慮到效率,這就需要用到二叉樹。講下去會沒完沒了,如果你使用STL 的map容器,你可以非常方便的實現這個功能,而不用關心其細節。關於map的資料結構細節,感興趣的朋友可以參看
學習STL map, STL set之資料結構基礎。看看map的實現:

相關推薦

hashmap區別聯絡應用

一,hashtable原理: 雜湊表又名散列表,其主要目的是用於解決資料的快速定位問題。考慮如下一個場景。 一列鍵值對資料,儲存在一個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我一個個拿出來比較key啊,呵呵。 大家都知道,在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣

JS陣列常用方法:forEach、map、filter、some、every,filtermap區別

forEach() 方法對陣列的每一個元素執行一次提供的函式。 map() 方法建立一個新陣列,其結果是該陣列都執行一次函式,原函式保持不變。 filter() 方法使指定函式測試陣列的每一個元素,並放回一個通過元素的新陣列。 some() 方法測試該陣列有元素通過了指

cookiesession區別聯絡原理

session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。           當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識 (稱為session id),如果已包含則說明以前

哈希(Hash)加密(Encrypt)的基本原理、區別及工程應用

class 區別 自己 裏的 lpad returns .net 角度 table 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論

【轉】哈希(Hash)加密(Encrypt)的基本原理、區別及工程應用

phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以

java List 、Set 、Map集合聯絡區別

List Map Set 集合 一、基礎概念 1. Collection 和 Map 介面 ​ Java集合框架主要由 Collection和Map兩個根介面及其子介面、實現類組成。 ​ 1) Collection 介面是Set、List、和Queue介面的父介面: ​ Coll

雜湊(Hash)加密(Encrypt)的基本原理、區別及工程應用

0、摘要       今天看到吉日嘎拉的一篇關於管理軟體中資訊加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了資訊管理軟體中如何通過雜湊和加密進行資料保護。但是從文章評論中也可以看出很多朋友對這個方面一些基本概念比較模糊,這樣就容易“照葫蘆畫瓢”,不能根據自身具體情況靈活選擇和使

Hibernate中getCurrentSession()openSession()的區別應用

rop 綁定 cto 關閉 hiberna code pre thread 線程 獲取openSession和CurrentSession: session=HibernateSessionFactory.getSession(); session=HibernateSes

listSet、Map區別及適用場景

適合 線程 可重復 set、map equals 註意 位置 tor span 1、List,Set都是繼承自Collection接口,Map則不是 2、List特點: 元素有放入順序,元素可重復 ,Set特點:元素無放入順序,元素不可重復,重復元素會覆蓋掉,(註意:元

索引原理-btree索引hash索引的區別

基於 信息 一起 特殊性 hash算法 一個 即使 數據 就會   btree索引與hash索引的區別,之前不清楚,mark一下。   Hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多

spark中mapmapPartitions區別

part print map spark 偽代碼 一個 數據 最終 partition 在spark中,map與mapPartitions兩個函數都是比較常用,這裏使用代碼來解釋一下兩者區別 import org.apache.spark.{SparkConf, Spar

應用層(http協議) httphttps區別

在協議分層的TCP/IP(或四層)通訊協議採用了5層的層級結構,5層分別包括:應用層、傳輸層、網路層、資料鏈路層、物理層。5層一些簡單功能和著名協議可參考這篇部落格:https://blog.csdn.net/sophia__yu/article/details/82717115 一.應用層

hashCodeequals的聯絡區別

一、equals方法的作用 1、預設情況(沒有覆蓋equals方法)下equals方法都是呼叫Object類的equals方法,而Object的equals方法主要用於判斷物件的記憶體地址引用是不是同一個地址(是不是同一個物件)。 2 、要是類中覆蓋了equals方法,那麼就要根據具

(&&,||)(&,|)的區別應用

簡單陳述:||,&&判斷中前面的表示式滿足條件時,不會再執行後面的表示式(短路);&,| 程式會繼續執行後面的表示式 C#,JAVA裡都是這樣 對於(&,|),運算的物件是位,也就是1/0,叫做位運算子 對於(&&,||),運算的

forEachmap的使用區別

js中,經常需要對陣列進行遍歷操作,對陣列進行遍歷操作可以使用Array提供的forEach方法和map方法 那兩者在使用上有啥區別呢?分別在什麼情況下使用呢? forEach()方法 對陣列的每一個元素都執行一次提供的函式 let a = ['a', 'b', 'c']

Map | putputIfAbsent區別

區別: put在放入資料時,如果放入資料的key已經存在與Map中,最後放入的資料會覆蓋之前存在的資料; putIfAbsent 如果傳入key對應的value已經存在(注意這裡,因為Map 中value可以為null,但是,這裡如果value為null,會當作value值不存

String、StringBufferStringBuilder的區別應用場景

1 String、StringBuffer與StringBuilder區別 (1)區別 String內容不可變,StringBuffer和StringBuilder內容可變; StringBuilder非執行緒安全(單執行緒使用),String與StringBuffer執行緒安全(多執

Android開發 Handler Runnable和Thread之間的區別聯絡 應用----------------

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

結構體物件的聯絡區別

結構體與物件的聯絡與區別 1.結構體是一種值型別,而類是引用型別。值型別用於儲存資料的值,引用型別用於儲存對實際資料的引用。 那麼結構體就是當成值來使用的,類則通過引用來對實際資料操作。   2.結構使用棧儲存(Stack Allocation),而類使用堆儲存(Heap Allocatio

Constructor object 區別聯絡

1. Constructor:是用於建立和初始化類中建立的一個物件的一種特殊方法。 constructor([arguments])  { ... } 在一個類中只能有一個名為 “constructor” 的特殊方法。 一個類中出現多次建構函式 (constructor)方法將會丟擲一個 Sy