雜湊表中使用素數作為表長的一點想法

2021-10-06 08:52:33 字數 990 閱讀 7567

昨天上資料結構課時,老師是這樣解釋為什麼用除留餘數法雜湊的雜湊表中使用素數作為表長的:

假設我們用偶數作為乙個表的表長,然後我們往裡面不斷加入奇數,那麼可以看到0,2,4...這些格仔就被浪費了,而1,3,5...這些格仔處就會有很大衝突。。。人們發現表長使用靠近需雜湊的數的總數的素數時效果最好。

我當時聽完覺得奇怪,憑什麼我要一直往裡面加入奇數來專門看這種特殊情況下的雜湊態。如果一定要以特殊情況來考慮,什麼表長的表雜湊效果都不會好,我只要不停往裡面加入表長整數倍的數,就永遠只有乙個格仔被用到了。(比如往表長13的雜湊表中新增13,26,39....)

後來查了一些資料,整理了一下現在自己大致的想法。參考了  (講的挺好)

首先雜湊需要的是將資料以盡可能減少衝突的方式放進表中。一般隨機且平均分布的數,以除留餘數的方法對映進雜湊表中時,效能都會好。這是很多文章中提到的,被雜湊數以間隔為1隨機生成時,使用素數與非素數沒區別的點所在。而以表長為間隔隨機生成被雜湊數時,所有表衝突程度也是一般大。所以我們接下來需要考慮的是,被雜湊數呈現一定規律,但不至於極端的情況。

比如以18作為表長,他有2,3,6,9幾個因子。則當被雜湊的數 在2,3,6,9的倍數列中 有較集**現 的現象時,以18作為表長衝突就會較大,我叫這些因子倍數列為衝突倍數列吧;而以19作為表長,由於19沒有多餘的因子,所以(1,19)中數的倍數列都不容易產生衝突。我們現在考慮隨機生成若干列分別為m1,m2...(其中1其實意思就是考慮了在position=x mod m(表長)  這個除留餘數的函式裡,x含 平均生成的倍數列 這種較特殊情況。所以一些文章中說表長取什麼數與x的生成方式有關,還有表長取2的冪次時有所謂效能最不理想的說法,因為可以看到在這種情況下衝突倍數列概率非常大。(因子倍數列即衝突倍數列:2,4,8...  以2的冪次為表長時,與表長設定大小相近的其他情況對比,它有因子且因子全是最小質數2,即因子倍數列在表長範圍內分布最為密集)

以上只是上完課後的一些理解,不正確的或考慮不周的地方歡迎指正(有些句子比較長,就用了空格作為停頓~)。

MySQL聯表的一點記錄

好久沒寫文章了。今天整理一下sql聯表的情況。回頭整理一下ocr識別近期的工作成果。mysql連表,就是多個表連線起來查詢。舉個例子 a 表裡面有id,name 字段,b表裡面有id,phone欄位。我們可以通過join 來進行連線,查詢id 相同的。example select from a,b ...

對C 中使用異常的一點想法

在使用c 開發應用程式的時候,很多程式設計師非常鍾情於使用try.catch.的異常捕獲機制.這使得程式的錯誤被悄然無聲的掩蓋了,對於使用者而言,無論程式內部發生了什麼樣的問題,而表相上卻像無事一樣風平浪靜.使用try.catch結構,有時是一種逃避責任的方法.無論這段 隱含著什麼樣的隱患,只需要用...

有關分割槽表的另一點

很久以前寫了乙個關於分割槽表的博文 後來在實際的工作中發現,我們的儲存過程中存在很多這樣子的寫法 create or replace procedure p test par v day in varchar2 as v sql varchar2 1000 begin v sql insert in...