[英]What is the difference between hash()%n and n%hash()
在許多課程提綱,教程中,我已經看到找到合適的單元格的一個不錯的選擇是計算單元格的數量: item.hash()%(n-1) = # of the bucket.
但是為什么要提到這個特定的表達呢?
(n-1)%item.hash() = # of the bucket
的倒數(n-1)%item.hash() = # of the bucket
與它有何不同?
PS我知道Java HashMap使用(n - 1) & hash
,我只想了解這兩種方法在稀疏密鑰方面的區別。
桶的倒數(n-1)%item.hash()=#與它有何不同?
基本上不起作用。
該表達式需要將哈希碼減少到0 .. n-1范圍內的值,以便可以將其用作大小為n的數組的下標。
但是“反向”功能無法做到這一點。 因此,如果嘗試使用它,則(指定的)存儲桶下標會給出異常,因為對於Java int
類型范圍內的大多數h值,h%(n-1)>(n-1)或<0。
由於@Zubuza注意余數(%)和除法(/)是不可交換的。
可以將運算符模數%
視為通過在較小范圍內減少它們來均勻分布一組數字的一種方式。 實際上,這組數字是輸入鍵的哈希碼。 較小的范圍是表的容量。
當您要在較小的表中分配索引以存儲較大的數字時,這是一種有用的技術。
逆運算聽起來很奇怪(並且沒有用):考慮到哈希碼是高數字且n小, n % hash
將始終返回n
,因此它根本沒有興趣。
實際上,Java是通過hash & (length-1)
選擇索引的,這在算術上並不等同於hash % length
,但是它是一種替代方法-減少和分發(比模數更便宜)(貸方@Zabuza)。
hash % n
與n % hash
之間的區別是, hash % n
將比n % hash
分布得多。
n % hash
幾乎總是等於n
,因為其中b > a
a % b
等於a
(例如15 % 30 = 15
)。
我創建了一個圖表來顯示差異 (紅色是x % n
,藍色是n % x
,其中x
代表哈希)。
Java中的想法是避免' 昂貴 ' %
(mod)操作,而是執行相對便宜的&
(and)操作。 但這僅在n
為2的冪時才有效。因此,Java HashMap對於存儲桶數始終使用2的冪。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.