我的hash底層實現(xiàn)原理_第1頁
我的hash底層實現(xiàn)原理_第2頁
我的hash底層實現(xiàn)原理_第3頁
免費預覽已結束,剩余4頁可下載查看

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、一個長度為 呢。一般情況是通過NGYNQK_ RKT 獲得,也就是元素的QK_的哈希值對數(shù)組長度取模得到.GYN3GV很不解,一個線性的數(shù)組怎么實現(xiàn)按鍵值對來存取數(shù)據(jù)呢?這里 .GYN3GV.GYN3GV類 +TZX_,其重要的屬性,從屬性QK_明顯的看出來 +TZX_ 就是 .GYN3GV 鍵值對實現(xiàn)的一個基礎 數(shù)組,這個數(shù)組就是 +TZX_AC,3GV 里面的內容都保存在 +TZX_AC里面XGTYOKTZ 二、.GYN3GV上面說到 .GYN3GV NGYN#QK_NGYN)UJK 這個NGYN)UJK一個長度為 呢。一般情況是通過NGYNQK_ RKT 獲得,也就是元素的QK_的哈希值

2、對數(shù)組長度取模得到.GYN3GV很不解,一個線性的數(shù)組怎么實現(xiàn)按鍵值對來存取數(shù)據(jù)呢?這里 .GYN3GV.GYN3GV類 +TZX_,其重要的屬性,從屬性QK_明顯的看出來 +TZX_ 就是 .GYN3GV 鍵值對實現(xiàn)的一個基礎 數(shù)組,這個數(shù)組就是 +TZX_AC,3GV 里面的內容都保存在 +TZX_AC里面XGTYOKTZ 二、.GYN3GV上面說到 .GYN3GV NGYN#QK_NGYN)UJK 這個NGYN)UJK方法這里不詳述只要理解每個QK_NGYN是一個固定OTJK#NGYN +TZX_AC+TZX_AOTJKC # 值 取值時 .GYN3GV 的底層實現(xiàn)原一、.GYN3GV夠

3、,希望在查詢關鍵字的時候不經(jīng)過任何比較,一次存取便能得到所查 。因此, 須在關鍵字和其對應的 位置間建立對應的關系 LL 被稱為哈希函數(shù),按此 建立的表為哈希表。關鍵在于哈希意思就是:關鍵字位置是有關鍵字的內容決定的數(shù)據(jù)結構中有數(shù)組和鏈表來實現(xiàn)對數(shù)據(jù),但這兩者基本上是兩區(qū)間是連續(xù)的,占用內存嚴重,故空間復雜的很大。但數(shù)組的二分查找時間復雜度小,為5 ;數(shù)組的區(qū)間離散,占用內存比較寬松,故空間復雜度很小,但時間復雜度很大,達5(4。鏈表的特點是:尋那能不能綜合兩者的特性,做出一種尋址容易刪除也容易的數(shù)據(jù)結構是肯定的,這就要提起的哈希表。哈希表(GYN ZGHR)便。法 拉鏈法,key,value

4、,XKZXT( 疑問:如果兩個QK_通過NGYN +TZX_ACRKTMZN得到的OTJK相同,會不會有XKZXT( 疑問:如果兩個QK_通過NGYN +TZX_ACRKTMZN得到的OTJK相同,會不會有覆蓋?這里 .GYN3GV提到過+TZX_類里面有一個TKZ性,作用是指下一個+TZX_。打個比方, 第一個鍵值對進來,通過計算其QK_NGYN得到的OTJK# +TZX_A C T也等于 ,現(xiàn)在怎么辦?.GYN3GVTKZ +TZX_ACOTJK TKZ+TZX_AC);發(fā)現(xiàn)OTJK# 的地方存取了 ( ) 三個鍵值對他們通過 TKZ 這個屬在一起。所以疑問不用擔心。也就是說數(shù)組的元素。到

5、這里為止,.GYN3GVVHIVZ1QK_ GRK OL QK_# XKZXTVZ,UX4RR1K_GRK ! RR總是放在數(shù)組的第一個鏈表 遍歷鏈表LUX +TZX_1$K#ZGHRKAOC!K #TR!K#KTKZ 5HPKIZ 如果 QK_ 在鏈表中已存在,則替換為新 GRKOL KNGYN#NGYN Q#KQK_ #QK_bbQK_KWGRYQ URJGRK #KKGRK#YZNOYXKZXTSUJ)UTZ XKZXTUOJ NGYN 1 QK_ GRK HIQKZ/TJK a+TZX_1$K#IKZTJKCTTZX_1$NGYN QK_ GRK K ! 參數(shù)K +TZX_ 如果 YK

6、 超過 ZNXKYNURJ,則擴充 ZGHRK 大小。再散列OL YOK $# XKYOK ZGHRKRKTMZN當然 .GYN3GV 里面也包含一些優(yōu)化方面的實現(xiàn),這里也說一下。比如:+TZX_AC的長度一定后,隨著 SGV 里面 數(shù)據(jù)的越來越長,這樣同一個 OTJK 的鏈就會很長,會不會影響性能?.GYN3GV 里面設置一個因子,隨著 SGVO#ONGYN ZGHRKRKTMZN NGYN # NGYNQK_NGYN)UJK OTJK#NGYN +TZX_ACNGYN#QK_NGYN)UJK ( )-VHIMKZ5HPKIZ( )-VHIMKZ5HPKIZQK_ OL QK_# XKZXT

7、 MKZ,UX4RR1K_ 先定位到數(shù)組元素,再遍歷該元素處的鏈表LUX +TZX_1$ K# ZGHRKAOTJK,UXNGYN ZGHRKRKTMZNK # 5HPKIZOL KNGYN#NGYN Q#KQK_ #QK_bbQK_KWGRY XKZXT K XKZXTc( )RQK_ 的存TRR QK_總是存放在+TZX_AC數(shù)組的第一個元素 VXOGZKVZ,UX4RR1K_GRK LUX +TZX_1$K#ZGHRKAC!K #TRR!K#KTKZ URJGRK #KKGRK#YZNOYXKZXTSUJ)UTZ GJJ+TZX_ TRR GRK XKZXTVXOGZKMKZ,UX4RR

8、1K_ LUX +TZX_1=while(capacitycapacity=this.loadFactor=threshold=)(capacity*table=newinitialCapacity 如果兩個不同對象的 hashCode 相同,這種現(xiàn)象。開放定址法(線性探測再散列,二次探測再散列,偽隨機探測再散列Javahashmaprehashtable voidnewCapacity)EntryoldTable=if(oldCapacity threshold EntrynewTable=newoldCapacity=capacity=HashMapkey 應該對應EntryZKYNURJ

9、 TK)GGI_ RUGJ,GIZUX *XGTYLKXYGRRKTZXOKYLXUSIXKTZZGHRK UJZXGTYLKX+TZX_ACTKGHRK +TZX_ACYIZKYNURJ TK)GGI_ RUGJ,GIZUX *XGTYLKXYGRRKTZXOKYLXUSIXKTZZGHRK UJZXGTYLKX+TZX_ACTKGHRK +TZX_ACYI#TK)GVGIOZ_ # TKGHRK GHRKP# !PYXIRKTMZN!P +TZX_1 $ K # YXIAOL K # JU +TZX_1$TKZ#K O#OTJK,UXKNGYN TK)GVGIOZ_KTKZ#GHRTKGH

10、RKAOC#K! K # TKZ!cNORK K #cccZXGTYLKX TKGHRK ZGHRK # TKGHRK!.GYN:GHRK.GYN3GV區(qū)VHIIRGYY.GYNZGHRKKZKTJYXOSVRKSKTZY.GYN:GHRK.GYN3GV區(qū)VHIIRGYY.GYNZGHRKKZKTJYXOSVRKSKTZY3GV VHIIRGYY .GYN3GVKZKTJY HYZXGIZ3GV OSVRKSKTZY 3GV.GYNZGHRK 中的方法是同步的,而 .GYN3GV 中的方法在缺省情況下是非同步的。即是說,在多線程應用程序 .GYNZGHRK.GYN3GV,則需要額外的同步機制。

11、但.GYN3GV 的同步問題可通過 )URRKIZOUTY 的一個靜態(tài)方法得到解決: 3GV )URRKIZOUTY _IUTOKJ3GV3GV 3 這個方法返回一個同步的 3GV,這個 3GV 封裝了底層的 .GYN3GV 的所有方法,使得底層的 .GYN3GV 即使是GYNZGHK 中,QK_ 和 GRK 都不允許出現(xiàn) TRR 值能由 MKZ 方法來判斷 .GYN3GV 中是否存在某個鍵, 而應該用 IUTZGOTY1K_ 方法來判斷.GYNZGHRK、.GYN3GV 都使用了 /ZKXGZUX。而由于歷史原因,.GYNZGHRK 還使用了+TSKXGZOUT的方式 哈希值的使用不同,.G

12、YNGHRK 直接使用對象的 NGYN)UJK。而 .GYN3GV 重新計算 NGYN 值。.GYNZGHRK 和 .GYN3GV 它們兩實現(xiàn)方式的數(shù)組的初始大小和擴容的方式。.GYNGHRK 中 NGYN 數(shù)組默大小是 ,增加的方式是 URJ 。.GYN3GVNGYN 數(shù)組的默認大小是 ,而且一定是 的指數(shù)。.GYNZGHRK 與 YN3GV 的區(qū)YN3GV 融合了 NGYNZGHRK 和 NGYNSGV 二者的優(yōu)勢NGYNZGHRK 是做了同步的,NGYNSGV 未考慮同步。所以 NGYNSGV 在單線程情況下效率較高。NGYNZGHRK 在的YN3GV 正是為了解決這個問題而誕生的YN3

13、GV 鎖的方式是稍微細粒度的。 YN3GV將NGYN表分為 個桶(默認值,但是 NGYNZGHRK 每次同步執(zhí)行的時候都要鎖住整個結構在 .GYN3GV 中,TRR 可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為 TRR。當 MKZ 方法返回 TRR 值時,即可以表示 .GYN3GV 中沒有該鍵,也可以表示該鍵所對應的值為 TRR。因此,在 .GYN3GV 中試想,原來 只能一個線程進入,現(xiàn)在卻能同時 個寫線程進入(之后會提到乎是完全的并發(fā)操作,而寫操作鎖定的粒度又非常細,比起之前又更加快速(些。只有試想,原來 只能一個線程進入,現(xiàn)在卻能同時 個寫線程進入(之后會提到乎是完全的并發(fā)操作,而寫操作鎖定的粒度又非常細,比起之前又更加快速(些。只有在求

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論