也谈Hashtable
1.Hashtable 到底是什么
2.為什么要用到Hashtable
3.Hashtable 和 Dictionary 和什么不同
?
說到集合,他有可能是代碼中用到最多的東西,C#集合的確是一個很好用的類型,
哪么,何時會用到?
for example:
1.當我要放置一組數據
?2.當我們需要一個動態可變長的數組
3.需要通過一個鍵值去索引數據項的一組數據
?
其實在某些情況下.我們完全可以不用集合,用數組同樣可以實現,但為了方便,集合成為首先.
哪么集合到底是什么,他內部又怎么工作?
集合就是數組,他是數組的封裝,在他的內部實現了數組動態的更改長度,
我們都知道數組在定義的時候已經確定的長度,但怎么能動態更改長度呢.這里就是集合內部的辦法實現
?
Hashtable 不只是實現了動態改動數組長度,更重要一點他是散列鍵值.將數據均勻分布到數組中
?
Hashtable數據是存放在內部一個成員數組中,這個數組的類型為Bucket類型
Bucket類型包括以下三個成員
Key?? Object類型的鍵
Val??? Object類型的值
Hash_Coll Key通過Hash算法得出的數值
當Hashtable被實例化時,并不會立刻在內存中開辟Bucket數組空間,它的實例方法有幾個重載,其中一個重要的參數就是增量因子,增量因子的默認值為0.72這是微軟推薦的一個數值。
?
接下來當第一個數據被加入Hashtable中,成員方法Resize去計算數組的長度而這個長度受增量因子的影響,最終計算出數組的大小
?
當數組計算出大小后,接下來怎么將數據放入數組中.放在什么位置這兩個問題是Hashtable中實現的最重要方法,也是清楚分析Hashtable中邏輯算法最重要的地方.
?
Hashtable 表中單個項所在的索引位置是由key的散列值所決定,
1.F(n) = F1(n)
2.F(n) = F1(n) + F2(n)
以下兩種方法是hash取值的算法,方法一是默認算法,假如方法一結果位置已被占用,哪么使用方法二,方法二在方法一的基礎上使用一個增量函數使之繼續偏移,直到找到空位置.這種方式叫 "開放定址法"
?
所以說hashtable 沖突出現的次數越少,哪么數據寫入效率就越高,哪么算法直接影響到沖突的次數,
當索引項的時個是一個相似過程,首先使用 方法一計算出位置,然后通過比較hash_coll的值確定是否為要找到數據.因為hash_coll保存的是hash原始值,所以做對比可以很快判斷,如果并非我們要找的數據.哪么繼續使用增量函數直到找到數據為止.
?
下篇我們討論一下hashtable 的內部算法.?
轉載于:https://www.cnblogs.com/hznet/archive/2010/09/17/Hashtable.html
總結
以上是生活随笔為你收集整理的也谈Hashtable的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 控制结构(1)-判断控制
- 下一篇: JBOSS 端口修改说明