除留余数法学习
除留余數(shù)法介紹
除留余數(shù)法此方法為最常用的構(gòu)造散列函數(shù)方法。對(duì)于散列表長(zhǎng)為m的散列函數(shù)公式為:
f( key ) = key mod p ( p ≤ m )
mod是取模(求余數(shù))的意思。事實(shí)上,這方法不僅可以對(duì)關(guān)鍵字直接取模,也可在折疊、
平方取中后再取模。
一個(gè)例子
? 很顯然,本方法的關(guān)鍵就在于選擇合適的p, p如果選得不好,就可能會(huì)容易產(chǎn)生同義詞。
? 下面我們來舉個(gè)例子看看:
? 有一個(gè)關(guān)鍵字,它有12個(gè)記錄,現(xiàn)在我們要針對(duì)它設(shè)計(jì)一個(gè)散列表。如果采用除留余數(shù)法,
? 那么可以先嘗試將散列函數(shù)設(shè)計(jì)為f(key) = key mod 12的方法。比如29 mod 12 = 5,所以
? 它存儲(chǔ)在下標(biāo)為5的位置。
? 不過這也是存在沖突的可能的,因?yàn)?2 = 2×6 = 3×4。
? 如果關(guān)鍵字中有像18(3×6)、30(5×6)、42(7×6)等數(shù)字,它們的余數(shù)都為6,這就和78所對(duì)應(yīng)
? 的下標(biāo)位置沖突了。
如何合理選取p值
? 使用除留余數(shù)法的一個(gè)經(jīng)驗(yàn)是,若散列表表長(zhǎng)為m,通常p為小于或等于表長(zhǎng)(最好接近m)的最小質(zhì)數(shù)或不包含小于20質(zhì)因子的合數(shù)。
? 這句話怎么理解呢?要不這樣吧,
? 我再舉個(gè)例子:某散列表的長(zhǎng)度為100,散列函數(shù)H(k)=k%P,則P通常情況下最好選擇哪個(gè)呢?
? A、91 B、93 C、97 D、99
?實(shí)踐證明,當(dāng)P取小于哈希表長(zhǎng)的最大質(zhì)數(shù)時(shí),產(chǎn)生的哈希函數(shù)較好。我選97,因?yàn)樗请x長(zhǎng)度值最近的最大質(zhì)數(shù)。
除留余數(shù)法此方法為最常用的構(gòu)造散列函數(shù)方法。對(duì)于散列表長(zhǎng)為m的散列函數(shù)公式為:
f( key ) = key mod p ( p ≤ m )
mod是取模(求余數(shù))的意思。事實(shí)上,這方法不僅可以對(duì)關(guān)鍵字直接取模,也可在折疊、
平方取中后再取模。
一個(gè)例子
? 很顯然,本方法的關(guān)鍵就在于選擇合適的p, p如果選得不好,就可能會(huì)容易產(chǎn)生同義詞。
? 下面我們來舉個(gè)例子看看:
? 有一個(gè)關(guān)鍵字,它有12個(gè)記錄,現(xiàn)在我們要針對(duì)它設(shè)計(jì)一個(gè)散列表。如果采用除留余數(shù)法,
? 那么可以先嘗試將散列函數(shù)設(shè)計(jì)為f(key) = key mod 12的方法。比如29 mod 12 = 5,所以
? 它存儲(chǔ)在下標(biāo)為5的位置。
? 不過這也是存在沖突的可能的,因?yàn)?2 = 2×6 = 3×4。
? 如果關(guān)鍵字中有像18(3×6)、30(5×6)、42(7×6)等數(shù)字,它們的余數(shù)都為6,這就和78所對(duì)應(yīng)
? 的下標(biāo)位置沖突了。
如何合理選取p值
? 使用除留余數(shù)法的一個(gè)經(jīng)驗(yàn)是,若散列表表長(zhǎng)為m,通常p為小于或等于表長(zhǎng)(最好接近m)的最小質(zhì)數(shù)或不包含小于20質(zhì)因子的合數(shù)。
? 這句話怎么理解呢?要不這樣吧,
? 我再舉個(gè)例子:某散列表的長(zhǎng)度為100,散列函數(shù)H(k)=k%P,則P通常情況下最好選擇哪個(gè)呢?
? A、91 B、93 C、97 D、99
?實(shí)踐證明,當(dāng)P取小于哈希表長(zhǎng)的最大質(zhì)數(shù)時(shí),產(chǎn)生的哈希函數(shù)較好。我選97,因?yàn)樗请x長(zhǎng)度值最近的最大質(zhì)數(shù)。
總結(jié)
- 上一篇: scrapy框架使用教程
- 下一篇: 路由器有外派信号但无服务器,路由器有信号