初步學習HashTable(哈希表或者散列鏈表)


初次接觸哈希表,我談談自己對哈希表的一些理解,可能有誤,還望指正。

對於哈希表,存放的數據是鍵值對<key,value>。是按照鍵值來索引的,鍵key可以是字符串、單個字符、整形數等,值value就是存放結點數據。

通俗的說,對於哈希表,使用數組來存放基本的結點,每個結點在掛上一串鏈表構成的結構,如下圖所示:

數組存放的可以是不存儲任何數據的頭結點,我們的數據是存放在以為頭結點開始的鏈表上的。圖中的結點的中存放着鍵值對和指向下一個結點的指針。


索引原理:Java中是根據鍵進行二次哈希得到哈希值,再由哈希值&(array.length-1)映射到數組下標,或者用哈希值%array.length映射。不同的鍵可以映射到同一個數組下標,采用鏈表來解決哈希沖突。基本的原理也就是有key通過hash函數(hash變換)得到hash量,再由hash量通過變換映射到數組下標上,通常為取余操作%和與操作&。

總之,就是通過算法將key映射到數組下標上。

個人理解:數組下標的索引為常數復雜度,hash表就是利用這一點來提高搜索效率的,定位到key對應的數組位置只需要O(1)的復雜度,然后再對鏈表進行遍歷即可。

如果同樣的數據用數組進行存儲的話,數組長度為length,那么改用hash表來存儲,查找的效率可以提高length倍。

但是得注意:hash相同,但是key不一定相同。  key相同,則hash一定相同。

正因為如此,所以才會出現哈希沖突,有三種解決方法,下面的參考中有。這里哈希表采用外加鏈表法。

 

參考:

[1] http://m.blog.csdn.net/stayneckwind2/article/details/53574685 

[2] http://m.blog.csdn.net/u014539992/article/details/52874819

[3] http://m.blog.csdn.net/u014613043/article/details/50726630

[4] http://m.blog.csdn.net/xiaotan2011929/article/details/61647556

參考視頻:

https://pan.baidu.com/s/1eSm3zma


免責聲明!

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



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