浅谈哈希表
1. 引言
????????哈希表(Hash Table)的應(yīng)用近兩年才在NOI中出現(xiàn),作為一種高效的數(shù)據(jù)結(jié)構(gòu),它正在競賽中發(fā)揮著越來越重要的作用。
哈希表最大的優(yōu)點,就是把數(shù)據(jù)的存儲和查找消耗的時間大大降低,幾乎可以看 成是常數(shù)時間;而代價僅僅是消耗比較多的內(nèi)存。然而在當(dāng)前可利用內(nèi)存越來越 多的情況下,用空間換時間的做法是值得的。另外,編碼比較容易也是它的特點之一。
????????哈希表又叫做散列表,分為“開散列” 和“閉散列”。考慮到競賽時多數(shù)人通常避免使用動態(tài)存儲結(jié)構(gòu),本文中的“哈希表”僅指“閉散列”,關(guān)于其他方面讀者可參閱其他書籍。
2. 基礎(chǔ)操作
2.1 基本原理
????????我們使用一個下標(biāo)范圍比較大的數(shù)組來存儲元素。可以設(shè)計一個函數(shù)(哈希函數(shù), 也叫做散列函數(shù)),使得每個元素的關(guān)鍵字都與一個函數(shù)值(即數(shù)組下標(biāo))相對應(yīng),于是用這個數(shù)組單元來存儲這個元素;也可以簡單的理解為,按照關(guān)鍵字為每一 個元素“分類”,然后將這個元素存儲在相應(yīng)“類”所對應(yīng)的地方。 但是,不能夠保證每個元素的關(guān)鍵字與函數(shù)值是一一對應(yīng)的,因此極有可能出現(xiàn)對于不同的元素,卻計算出了相同的函數(shù)值,這樣就產(chǎn)生了“沖突”,換句話說,就是把不同的元素分在了相同的“類”之中。后面我們將看到一種解決“沖突”的簡便做法。
總的來說,“直接定址”與“解決沖突”是哈希表的兩大特點。
2.2 函數(shù)構(gòu)造
構(gòu)造函數(shù)的常用方法(下面為了敘述簡潔,設(shè) h(k) 表示關(guān)鍵字為 k 的元素所對應(yīng)的函數(shù)值):
a) 除余法:
選擇一個適當(dāng)?shù)恼麛?shù) p ,令 h(k ) = k mod p ,這里, p 如果選取的是比較大的素數(shù),效果比較好。而且此法非常容易實現(xiàn),因此是最常用的方法。
b) 數(shù)字選擇法:
如果關(guān)鍵字的位數(shù)比較多,超過長整型范圍而無法直接運算,可以選擇其中數(shù)字分布比較均勻的若干位,所組成的新的值作為關(guān)鍵字或者直接作為函數(shù)值。
2.3 沖突處理
????????線性重新散列技術(shù)易于實現(xiàn)且可以較好的達(dá)到目的。令數(shù)組元素個數(shù)為 S ,則當(dāng) h(k) 已經(jīng)存儲了元素的時候,依次探查 (h(k)+i) mod S , i=1,2,3…… ,直到找到空的存儲單元為止(或者從頭到尾掃描一圈仍未發(fā)現(xiàn)空單元,這就是哈希表已經(jīng)滿了,發(fā)生了錯誤。當(dāng)然這是可以通過擴大數(shù)組范圍避免的)。
轉(zhuǎn)載于:https://www.cnblogs.com/wspblog/p/4931238.html
總結(jié)
- 上一篇: 用来用去还是觉得SDCMS好用
- 下一篇: 在NSUserDefaults中存储自定