以靜態(tài)表為例,原理如下圖,也就是多個(gè)單鏈表存儲(chǔ)在同一個(gè)數(shù)組中。勉強(qiáng)算開地址哈希表吧,但跟一般開地址哈希表原理
不太一樣。存儲(chǔ)在同一個(gè)數(shù)組的目的是節(jié)省一個(gè)表頭指針,有表頭指針的哈希表見本主頁"雙數(shù)組哈希unordered_xxx"相
對(duì)于傳統(tǒng)的拉鏈哈希表,這個(gè)哈希表的原理不太好理解(傳統(tǒng)的好理解,但耗費(fèi)內(nèi)存多且速度慢~~)
看上圖。使用默認(rèn)值覆蓋的原因是我們?cè)居盟?jì)算陸地坐標(biāo),(0,0,0)這個(gè)點(diǎn)在海里,我們根本用不上。如果想存入
默認(rèn)值的話,需要小改一下代碼,節(jié)點(diǎn)snode增加一個(gè)計(jì)數(shù)器跟指針組成union,默認(rèn)值放在slot最高端做特殊處理。

顯然他比雙數(shù)組哈希表節(jié)約內(nèi)存,這不必說了,速度當(dāng)然也要比雙數(shù)組哈希表稍慢一點(diǎn),但慢不了太多,不過還是比
常見的數(shù)組+鏈表的拉鏈哈希表快,當(dāng)然僅局限于處理整數(shù),處理長(zhǎng)字符竄的話,可以改為處理字符竄指針理論上會(huì)
好一些。順便說一句,最適合處理字符竄的數(shù)據(jù)結(jié)構(gòu)顯然不是哈希表,而是trie,如果內(nèi)存不充裕則應(yīng)該用有向無環(huán)圖。

這個(gè)表用于PC機(jī)上意義不大,用于內(nèi)存相對(duì)緊張,硬件計(jì)算能力十分有限的嵌入式則意義非凡。

PC機(jī)上我用64位的g++4.8.2和VC++11.0編譯OK,別的編譯器不知道能否通過。分別在Windows7 X64和
Debian 7.2 X64系統(tǒng)上用g++編譯做了測(cè)試,僅僅測(cè)試了64位偽隨機(jī)數(shù),跟系統(tǒng)的std::unordered_map做個(gè)簡(jiǎn)
單的比較,結(jié)果如下。

Sample::unordered_map的erase操作比find和insert顯著慢的原因是減肥了,當(dāng)空間利用率50%的時(shí)候自動(dòng)
減肥,釋放用不到的空間。實(shí)時(shí)性要求高且內(nèi)存碎片敏感的嵌入式里應(yīng)該禁止resize,減少碎片且提升速度。
上表僅僅是靜態(tài)表的測(cè)試結(jié)果,在PC上模擬的。在Linux和Windows都用的g++4.8.2編譯器。

源代碼
https://github.com/chipsethan/HashTable.git