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的實現:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM