閱讀449 返回首頁    go 阿裏雲 go 技術社區[雲棲]


查找與散列(Hash)

查找與散列(Hash)

1.查找的一些概念

查找——在給定集合中查找特定的元素。

在查找的過程中,查找的長度是指關鍵字間的比較次數,而平均查找長度則是數學上的期望:ASL=P1*C1+P2*C2+...+Pn*Cn。 Pi為查找第i個元素的概率,Ci為查找第i個元素所需的查找長度。一般認為每個元素查找概率相同。平均查找長度分為查找成功和查找不成功長度兩種。

對於順序查找來說。ASL(成功)=(1+2+...+n)*1/n=(n+1)/2;ASL(不成功)=n。

折半查找的查找過程可以用判定樹來描述。

ASL(成功)=int[log(2)(n)]+1。

微笑例題:【2010研招】已知一個長度為16的順序表L,其元素有序,若采用折半查找去查找一個不存在的元素,則關鍵字的比較次數最多是(5次)

答:具有n個結點的判定樹高度為int[log(2)(n)]+1。所以最多比較5次。

 

2.散列表(Hash)

散列:把元素的內容與元素的存儲地址關聯起來,提高查找效率。

散列函數:實現從元素值到存儲地址的映射。

散列表:記錄元素值到存儲地址的映射。

常用散列函數:

1.直接定址法:H(key)=a*key+b。

2.除留餘數法:H(key)=key mod b。

處理衝突的方法:

1.拉鏈法——把所有同義詞存儲在一個鏈表中。

2.線性探測法——衝突發生時,查找該衝突位置後麵的單元,遇到空單元時把地址填進去。

散列表的查找效率取決於三個因素:散列函、衝突處理方法和填裝因子。

填裝因子=元素數目/散列表長度。填裝因子越大,散列表越滿,發生衝突的可能性就大。

微笑例題:【2010研招】將關鍵字序列(7,8,30,11,18,9,14)7個元素散列存儲到散列表中。散列表的存儲空間是下標從0開始的一維數組,散列函數為H(key)=key*3 mod 7。處理衝突的方法為線性探測再散列法,填充因子為0.7。

1)請畫出散列表;

2)分別計算等概率情況下,查找成功和查找不成功的平均查找長度。

引申:

他人blog——從頭到尾徹底解析Hash 表算法

https://blog.csdn.net/v_july_v/article/details/6256463

最後更新:2017-04-03 12:56:01

  上一篇:go deque queue and priority_queue
  下一篇:go 九度1254:N皇後問題