哈希表的大小为何最好是素数
引言
為什么散列函數(shù)采用取模運算?又為什么取模運算的被取模數(shù)最好是素數(shù)?素數(shù)是如何在取模運算中很好的規(guī)避沖突的?
這些問題可能困擾諸多程序員很久了。我們總是說素數(shù)可以更好的避免沖突,但總是對各種長篇大論的分析望而卻步。
這篇文章是我在學(xué)習(xí)散列時針對素數(shù)在哈希函數(shù)中的如何成功避免大量沖突的原因總結(jié)。
盡可能言簡意賅地描述為什么素數(shù)那么香。
一、結(jié)論
素數(shù)能夠在取模運算中避免沖突并不是一個數(shù)學(xué)定律,而且能夠避免沖突也不是絕對的。
從規(guī)律上來看,如果待存儲的數(shù)列間隔恰好是是被取模數(shù)的因子大小,那么合數(shù)要比素數(shù)更容易呈現(xiàn)周期性的取模重復(fù)。
這僅僅是一個規(guī)律,目前數(shù)學(xué)家也無法對這一規(guī)律進行嚴格定義,畢竟這個規(guī)律也并不是絕對的。
二、演示
我們通過一個簡單的例子來印證一下上面的這個規(guī)律:
從規(guī)律上來看,如果待存儲的數(shù)列間隔恰好是是被取模數(shù)的因子大小,那么合數(shù)要比素數(shù)更容易呈現(xiàn)周期性的取模重復(fù)。
這個規(guī)律不是絕對的。下面選取了一個合數(shù)和一個素數(shù),待存儲的數(shù)列間隔為 2 或 3,請仔細觀察規(guī)律:
| 1 | 數(shù)列間隔 3 (3是12的因子) | 數(shù)列 | 34 | 37 | 40 | 43 | 46 | 49 | 52 | 55 | 58 |
| 2 | mod 11 = | 1 | 4 | 7 | 10 | 2 | 5 | 8 | 0 | 3 | |
| 3 | mod 12 = | 10 | 1 | 4 | 7 | 10 | 1 | 4 | 7 | 10 | |
| 4 | mod 13 = | 8 | 11 | 1 | 4 | 7 | 10 | 0 | 3 | 6 | |
| 5 | mod 14 = | 6 | 9 | 12 | 1 | 4 | 7 | 10 | 13 | 2 | |
| 6 | 數(shù)列間隔 2 (2是12、14的因子) | 數(shù)列 | 67 | 69 | 71 | 73 | 75 | 77 | 79 | 81 | 83 |
| 7 | mod 11 = | 1 | 3 | 5 | 7 | 9 | 0 | 2 | 4 | 6 | |
| 8 | mod 12 = | 7 | 9 | 11 | 1 | 3 | 5 | 7 | 9 | 11 | |
| 9 | mod 13 = | 2 | 4 | 6 | 8 | 10 | 12 | 1 | 3 | 5 | |
| 10 | mod 14 = | 11 | 13 | 1 | 3 | 5 | 7 | 9 | 11 | 13 |
上圖中,數(shù)列代表待存儲的整型數(shù)據(jù),一般在很多散列表(如HashMap)中,都是通過對關(guān)鍵字進行某種變換得到一個整型數(shù)字,比如,如果key是字符串,那么可以通過計算字符編碼得到一個整數(shù)值。
mod 11 代表對11取模,mod 12 代表對 12 取模,依此類推。
我們分別選取了比較普通的兩組數(shù)列,分別對合數(shù)(12、14)和素數(shù)(11、13)進行取模運算,可以看到,取模結(jié)果重復(fù)的已經(jīng)使用紅色標記。
當數(shù)列間隔為 3 時,由于 3 是 12 的因子,因此,可以看到表中 mod 12 的結(jié)果呈現(xiàn)了周期性的模沖突。而其他的 11、13、14,并沒有發(fā)現(xiàn)明顯的沖突問題,而是很好地分散了取模結(jié)果。
當數(shù)列間隔為 2 時,由于 2 是 12、14 的因子,因此,可以看到表中 mod 12 和 mod 14 的結(jié)果都呈現(xiàn)了周期性的模沖突,而 11、13 兩個素數(shù)并沒有發(fā)現(xiàn)明顯的沖突問題,而是很好地分散了取模結(jié)果。
總結(jié)
從實驗結(jié)果可以清晰的看到,素數(shù)要比合數(shù)更適合取模運算。在不知道數(shù)列間隔的情況下,擁有較少因子的素數(shù)可以有效的避免規(guī)律性的取模沖突。
大家如果對我的結(jié)論感興趣,可以通過對比試驗來嘗試尋找數(shù)列間隔與因子之間的關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的哈希表的大小为何最好是素数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css如何实现一个小三角形,用纯css写
- 下一篇: 扫地机器人划伤地板_扫地机器人哪个牌子好