下面是涉及均勻分佈和最大負荷的這個問題的解決方案的粗略開始。
除了垃圾桶,垃圾桶,垃圾箱或垃圾箱或m和n,人們(p)和門(d)都將被用作名稱。
給定一定數量的人每個門的確切預期值。例如,對於5人和5個門,期望的最大門正好是平均值(p/d)以上的1.2864 {(1429-625)/ 625},並且最小門正好是-0.9616 {(24-625)/ 625 }低於平均值。最高門距離平均值的絕對值比最小門的距離大一點,因爲所有的人都可以通過一扇門,但不小於零的門可以通過其中一扇門。隨着大量人員(p/d> 3000),最高門與平均值的距離與最低門之間的差異變得可以忽略不計。
對於奇數門,中心門基本爲零,不可擴展,但所有其他門都可以從表示p = d的某些值進行縮放。爲d = 5這些四捨五入值:
-1.163 -0.495 0 * 0.495 1.163 *慢慢地從-0.12
從這些值接近零,您可以計算人的預期數量的人的任何數通過5個門中的每一個,包括最大的門。除中間門外,與平均值的差值可以按sqrt(p/d)進行縮放。
因此,對於p = 50,000和d = 5:
預期通過最大門的人數,可能是5個門中的任何一個,= 1.163 * sqrt(p/d)+ p/d。 = 1.163 * sqrt(10,000)+ 10,000 = 10,116.3 對於p/d < 3,000,該等式的結果必須稍微增加。
隨着人數的增加,中間門從p = 100和d = 5時的-0.11968慢慢變得越來越接近於零。它總是可以被舍入到零,並且像其他4個門一樣有差異。
6米的門的值是: -1.272 -0.643 -0.202 0.202 0.643 1.272
對於1000門,近似值是: -3.25,-2.95,-2.79 ... 2.79,2.95,3.25
對於任何d和p,每個有序門都有確切的期望值。希望存在一個很好的近似值(相對誤差爲< 1%)。某個教授或數學家必須知道。
爲了測試均勻分配,您需要一些平均的有序會話(750-1000),而不是更多的人。無論如何,有效會話之間的差異都很大。這就是隨機性的本質。碰撞是不可避免的。 *
5門和6門的期望值是通過使用640位整數進行純粹的強力計算並平均對應相對門的絕對值的收斂來獲得的。 對於d = 5和p = 170: -6.63901 -2.95905 -0.119342 2.81054 6.90686 (27.36099 31.04095 33.880658 36.81054 40.90686) 對於d = 6且p = 108: -5.19024 -2.7711 -0.973979 0.734434 2.66716 5.53372 (12.80976 15.2289 17.026021 18.734434 20.66716 23.53372)
我希望你可以平均分配你的數據。
- 這幾乎可以保證喬治福爾曼的所有兒子或類似的情況都會對抗你的散列函數。適當的應急計劃是所有優秀程序員的工作。
感謝您的努力。鑑於'純粹'的隨機輸入,我正在通過將其性能與一些理論結果進行比較來驗證散列函數。由於Balls in Bins爲簡單的測量值提供了簡單的概率,我期望能夠輕鬆驗證我的哈希函數。但是接下來給出了最大加載順序的結果,然而帶'3'的結果看起來很有前途 - 但是它是'log2'或'loge'(我在考慮base?w.h.p :)? – philcolbourn 2010-04-11 00:12:44
也許不可能量化這個價值,但是這篇論文呈現的方式似乎給了希望。 我的想法是繪製最大負載行爲,以查看我是否處於一個常數因子範圍內,但即使使用65k個插槽的大表格,最大負載w.h.p也可能是4--因此常數因子非常重要。 – philcolbourn 2010-04-11 00:13:06
另外,實際上你並不打算用N散列來填充大小爲N的散列表,但是這個設置點似乎允許測試任何散列函數,這將會很好,並且保留散列函數性能參數 - 對於我來說,能夠說一個散列函數正確行爲的價值遠遠超過有人說「這個散列函數適用於長文本字符串」。 – philcolbourn 2010-04-11 00:13:25