雜湊表除留取餘法的桶個數為什麼是質數

2021-09-24 03:32:56 字數 813 閱讀 4192

可先科普下質數的概念:質數,也就是素數,就是指乙個大於1的自然數,約數(因數)只有1和它自己,否則叫合數。

除留取餘,就是雜湊函式將關鍵字被某個不大於雜湊表長m的數p除后所得餘數為雜湊位址。這是最常用、也最簡單的構造雜湊函式的方法。當然,也可以對關鍵字直接取模,也可以摺疊、平方取中等運算後取模。那麼問題來了,這個p取多大呢?p的取值不好,會不會造成雜湊函式的不均勻?先看乙個簡單的例子:

有乙個陣列: 1, 3,5,7,9,11,13, 15,17,19,21, 23,25   我們選取p為4(=2*2,含有約數2),即有四個桶,經過雜湊函式後,

為什麼會出現這種情況呢,那麼p應該怎麼選取呢?

我們發現,上面陣列求餘後的雜湊位址都為1,3,1,3,雜湊位址的值不是1,就是3,所有雜湊位址的差值不是2就是0,即3-3=0,1-1=0,3-1=2,恰好p=4的約數也是2,這個是不是巧合呢?

我們換乙個陣列來試一試:

陣列b:     28,35,63,77,105,我們取p=21(3*7)

我們的陣列差值都是7的倍數,雜湊位址也是7的倍數,即雜湊位址的差值也是0,7或者7的倍數,巧合的是我們的p也包含因數7。是不是只要p包含乙個因數,這個因數對陣列差值為這個因數的倍數整除的結果差值也是這個因數的倍數呢?

雜湊位址 (h(x)-h(y))%p= q*n%(t*q)=(q*n-t*q*r)=q*(n-tr);  t位整除的值。

因此,均雜湊在差值為q的位址上。

這樣,如果雜湊值的因數越多,可能導致的雜湊分布越不均勻,所以p的選擇需要選擇約數少的數值,什麼數值的約數最少呢?當然是只有1和它自己的質數了。所以往往將桶個數設定為質數或不包含小於20的質因數的合數。

PTA 雜湊查詢 除留取餘法

pta 聊天狂人 25 分 給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。輸入首先給出正整數n 10 5 為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格...

資料結構 雜湊表(除留取餘法 鏈位址法)

include using namespace std 雜湊函式的構造方法 除留取餘法 typedef struct node node typedef struct hash table hash table 初始化雜湊表 hash table inithashtable 在雜湊表中查詢資料 no...

雜湊表的實現(取餘法)

雜湊表,又叫雜湊表,它可以提供快速的插入查詢操作,對於大規模資料的查詢時間空間效率會很高。雜湊表構造方式有多種,其中取餘法在比賽中最常用。如果讀入很多值非常大的數,讓你判斷一些數是否出現過。如果用桶來記錄,空間開不了那麼大。如果排序後來查,時間效率又低。但可以通過hash優化解決這個問題。取餘法簡單...