日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

稀疏多项式的运算用链表_用漫画告诉你—什么是HashMap?

發布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 稀疏多项式的运算用链表_用漫画告诉你—什么是HashMap? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知,HashMap是一個用于存儲Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散存儲在一個數組當中,這個數組就是HashMap的主干。

HashMap數組每一個元素的初始值都是Null。

對于HashMap,我們最常使用的是兩個方法:Get 和 Put。

1.Put方法的原理

調用Put方法的時候發生了什么呢?

比如調用 hashMap.put("apple", 0) ,插入一個Key為“apple"的元素。這時候我們需要利用一個哈希函數來確定Entry的插入位置(index):

index = Hash(“apple”)

假定最后計算出的index是2,那么結果如下:

但是,因為HashMap的長度是有限的,當插入的Entry越來越多時,再完美的Hash函數也難免會出現index沖突的情況。比如下面這樣:

這時候該怎么辦呢?我們可以利用鏈表來解決。

HashMap數組的每一個元素不止是一個Entry對象,也是一個鏈表的頭節點。每一個Entry對象通過Next指針指向它的下一個Entry節點。當新來的Entry映射到沖突的數組位置時,只需要插入到對應的鏈表即可:

需要注意的是,新來的Entry節點插入鏈表時,使用的是“頭插法”。至于為什么不插入鏈表尾部,后面會有解釋。

2.Get方法的原理

使用Get方法根據Key來查找Value的時候,發生了什么呢?

首先會把輸入的Key做一次Hash映射,得到對應的index:

index = Hash(“apple”)

由于剛才所說的Hash沖突,同一個位置有可能匹配到多個Entry,這時候就需要順著對應鏈表的頭節點,一個一個向下來查找。假設我們要查找的Key是“apple”:

第一步,我們查看的是頭節點Entry6,Entry6的Key是banana,顯然不是我們要找的結果。

第二步,我們查看的是Next節點Entry1,Entry1的Key是apple,正是我們要找的結果。

之所以把Entry6放在頭節點,是因為HashMap的發明者認為,后插入的Entry被查找的可能性更大。

之前說過,從Key映射到HashMap數組的對應位置,會用到一個Hash函數:

index = Hash(“apple”)

如何實現一個盡量均勻分布的Hash函數呢?我們通過利用Key的HashCode值來做某種運算。

index = HashCode(Key) % Length ?

如何進行位運算呢?有如下的公式(Length是HashMap的長度):

index = HashCode(Key) & (Length - 1)

下面我們以值為“book”的Key來演示整個過程:

1.計算book的hashcode,結果為十進制的3029737,二進制的101110001110101110 1001。

2.假定HashMap長度是默認的16,計算Length-1的結果為十進制的15,二進制的1111。

3.把以上兩個結果做與運算,101110001110101110 1001 & 1111 = 1001,十進制是9,所以 index=9。

可以說,Hash算法最終得到的index結果,完全取決于Key的Hashcode值的最后幾位。

假設HashMap的長度是10,重復剛才的運算步驟:

單獨看這個結果,表面上并沒有問題。我們再來嘗試一個新的HashCode 101110001110101110 1011 :

讓我們再換一個HashCode 101110001110101110 1111 試試 :

是的,雖然HashCode的倒數第二第三位從0變成了1,但是運算的結果都是1001。也就是說,當HashMap長度為10的時候,有些index結果的出現幾率會更大,而有些index結果永遠不會出現(比如0111)!

這樣,顯然不符合Hash算法均勻分布的原則。

反觀長度16或者其他2的冪,Length-1的值是所有二進制位全為1,這種情況下,index的結果等同于HashCode后幾位的值。只要輸入的HashCode本身分布均勻,Hash算法的結果就是均勻的。

總結

以上是生活随笔為你收集整理的稀疏多项式的运算用链表_用漫画告诉你—什么是HashMap?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。