亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種高效的靜態(tài)哈希表實(shí)現(xiàn)方法及系統(tǒng)與流程

文檔序號(hào):12598746閱讀:310來(lái)源:國(guó)知局
一種高效的靜態(tài)哈希表實(shí)現(xiàn)方法及系統(tǒng)與流程
本發(fā)明旨在設(shè)計(jì)靜態(tài)哈希表壓縮算法,用于內(nèi)容過(guò)濾、信息安全等領(lǐng)域。由于靜態(tài)哈希表的存儲(chǔ)占用空間較大,現(xiàn)今的算法對(duì)于靜態(tài)哈希表的壓縮還有很大優(yōu)化空間。本發(fā)明旨在對(duì)靜態(tài)哈希表進(jìn)行壓縮,可支持對(duì)靜態(tài)哈希表的訪問(wèn)。
背景技術(shù)
:數(shù)據(jù)結(jié)構(gòu)中的查找表分為靜態(tài)查找表和動(dòng)態(tài)查找表。查找表主要針對(duì)表中的數(shù)據(jù)不斷地查找,直到找出其所需要的值為止。靜態(tài)查找表的類(lèi)型主要包括順序查找、二分查找、分塊查找及靜態(tài)樹(shù)表的查找等,而動(dòng)態(tài)查找表的類(lèi)型主要包括二叉排序樹(shù)、平衡二叉樹(shù)、B樹(shù)和B+樹(shù)等。上述介紹的查找算法查找的效率取決于比較次數(shù),查找平均次數(shù)越多,其效率越低,平均而言查找表的查找效率并不高。為了快速定位數(shù)據(jù),可以使用哈希表來(lái)提升訪問(wèn)效率。哈希表又叫做散列表,它利用鍵值對(duì)(key-value)來(lái)存儲(chǔ)數(shù)據(jù),是一種特殊的數(shù)據(jù)結(jié)構(gòu)。哈希表通過(guò)把鍵值對(duì)映射到表中一個(gè)位置來(lái)訪問(wèn)記錄,以加快查找的速度。這個(gè)映射函數(shù)叫做哈希函數(shù),存放記錄的數(shù)組叫做哈希表。哈希表中的映射不一定是單射,故可能會(huì)產(chǎn)生哈希沖突的現(xiàn)象,數(shù)據(jù)結(jié)構(gòu)中有很多算法可以解決哈希沖突。哈希表的應(yīng)用場(chǎng)景十分廣泛,應(yīng)用哈希表存儲(chǔ)數(shù)據(jù)來(lái)實(shí)現(xiàn)快速查找是很常見(jiàn)的操作。在實(shí)際的計(jì)算科學(xué)中,哈希表可以在對(duì)等網(wǎng)絡(luò)(P2P)中的路由選擇、數(shù)據(jù)庫(kù)查找、壓縮序數(shù)索引和信息安全等方面發(fā)揮著巨大的應(yīng)用。在實(shí)際生活中,哈希表也有著重要的作用。比如,銀行要進(jìn)行前臺(tái)數(shù)據(jù)和后臺(tái)數(shù)據(jù)進(jìn)行對(duì)賬處理時(shí),可以根據(jù)鍵查找到相應(yīng)的值,從而完成前后臺(tái)數(shù)據(jù)的對(duì)賬工作;生活中利用的IC卡乘坐公交時(shí),將IC卡的編號(hào)作為鍵,上車(chē)刷卡記錄為哈希表的插入過(guò)程,值中存儲(chǔ)上車(chē)時(shí)間和站名,下車(chē)刷卡記錄為哈希表的查找過(guò)程,同時(shí)刪除哈希表中此編號(hào)信息并計(jì)算時(shí)間和間距。哈希表按照是否支持動(dòng)態(tài)增刪操作,分為靜態(tài)哈希表和動(dòng)態(tài)哈希表。靜態(tài)哈希表是對(duì)于HASH操作只支持查詢(xún)操作,不支持動(dòng)態(tài)增刪操作。靜態(tài)哈希表適用于一次將數(shù)據(jù)預(yù)存至哈希表中,之后的工作主要負(fù)責(zé)快速查找數(shù)據(jù)。在模式串匹配算法中,靜態(tài)哈希表很符合某些算法的應(yīng)用背景,例如Wu-Manber、Karp-Rabin等高效算法都是利用HASH函數(shù)對(duì)規(guī)則進(jìn)行處理來(lái)匹配文本,這些哈希操作往往是預(yù)先將規(guī)則一次加載至哈希表中,然后再進(jìn)行匹配?,F(xiàn)今的哈希表算法主要包括線性探測(cè)哈希算法、二分查找算法和二分哈希算法。這些算法也滿(mǎn)足靜態(tài)哈希表的需求,在存儲(chǔ)和查詢(xún)時(shí)可以有效地定位數(shù)據(jù),但是其空間存儲(chǔ)與查詢(xún)效率方面還有很大提升空間。下面簡(jiǎn)要介紹各算法的思想。線性探測(cè)算法:當(dāng)關(guān)鍵字key的通過(guò)哈希函數(shù)H(key)得到的哈希地址p沖突時(shí),以p為標(biāo)準(zhǔn),通過(guò)哈希函數(shù)H(key)另外得到新的哈希地址p1,……,如此進(jìn)行迭代計(jì)算,當(dāng)終于有一個(gè)哈希地址pi不出現(xiàn)沖突時(shí)為止,并將所對(duì)應(yīng)的關(guān)鍵字和值存到該哈希地址上。查找時(shí),先通過(guò)哈希函數(shù)H(key),找出哈希桶中是否存在關(guān)鍵字key,若存在,返回value值。二分查找算法:存儲(chǔ)時(shí),對(duì)關(guān)鍵字key值排序;查找時(shí),利用二分算法查找key值,進(jìn)而查出value。二分哈希算法:鏈地址分為不同的哈希桶,存儲(chǔ)時(shí),每個(gè)桶內(nèi)利用二分查找算法存儲(chǔ)。查找時(shí),先通過(guò)哈希函數(shù)判斷所在哈希桶,在哈希桶內(nèi)利用二分查找算法查找key值,進(jìn)而查出value。上述哈希表的算法在實(shí)際中均有廣泛的應(yīng)用,其存儲(chǔ)和查詢(xún)效率各有差異,存儲(chǔ)所占空間和查詢(xún)效率方面各有千秋。為了設(shè)計(jì)更加高效的哈希表算法,更加節(jié)省哈希表所占用的空間,本發(fā)明將利用rank-select算法對(duì)靜態(tài)哈希表進(jìn)行壓縮,該算法在空間和時(shí)間方面與其他算法相比都有很大的提升。Rank-select算法是1989年文獻(xiàn)“JacobsonG.Space-efficientstatictreesandgraphs[C]//FoundationsofComputerScience,1989.,30thAnnualSymposiumon.IEEE,1989:549-554.”中用位向量存儲(chǔ)樹(shù)結(jié)構(gòu)所提出的一種壓縮空間的算法。下面將詳細(xì)介紹rank-select算法。Rank-select算法在文獻(xiàn)中主要是為了壓縮鄰接樹(shù)結(jié)構(gòu),如圖1所示,將原來(lái)的基于指針存儲(chǔ)的樹(shù)結(jié)構(gòu)簡(jiǎn)化為利用二進(jìn)制串進(jìn)行存儲(chǔ),其主要思想就是利用了rank-select算法。為介紹rank-select算法,首先定義參數(shù)rank(m):在二進(jìn)制字符串中從第一個(gè)位置開(kāi)始到位置m處1的個(gè)數(shù)。如圖2中rank(10)=7。圖3中,二叉樹(shù)從根節(jié)點(diǎn)按照二叉樹(shù)高度大小依次標(biāo)注節(jié)點(diǎn),其中黑色表示節(jié)點(diǎn)存在,白色表示節(jié)點(diǎn)為空,按照樹(shù)的層級(jí)結(jié)構(gòu)進(jìn)行層級(jí)存儲(chǔ),可以看到共有8個(gè)節(jié)點(diǎn)為1,代表原矩陣中的8個(gè)節(jié)點(diǎn)信息。由圖中可以看出,原二叉樹(shù)結(jié)構(gòu)的存儲(chǔ)1個(gè)節(jié)點(diǎn)利用n個(gè)字節(jié)存儲(chǔ),如果按照位進(jìn)行存儲(chǔ),其空間占用上會(huì)大大減少。在文獻(xiàn)“V,NavarroG.Rankandselectrevisitedandextended[J].TheoreticalComputerScience,2007,387(3):332-347.”中證明對(duì)于大小為n的位向量B,僅需要o(n)的額外存儲(chǔ)空間,即可實(shí)現(xiàn)O(1)時(shí)間復(fù)雜度的Rank操作。SSE指令級(jí)含有_mm_popcnt_u64等指令支持64位以上的rank位操作,在硬件上實(shí)現(xiàn)了rank操作,使得操作更加快捷。此外,Rank-select算法在壓縮稀疏矩陣方面能取得驚人的效果。Rank-select算法能有效壓縮數(shù)據(jù),可以轉(zhuǎn)化為哈希表的存儲(chǔ)結(jié)構(gòu),為簡(jiǎn)述O(1)復(fù)雜度的rank操作,現(xiàn)介紹一個(gè)例子說(shuō)明其算法思想。如圖4所示,對(duì)于大小為n*8位的位向量B,D表和C表分別存儲(chǔ)長(zhǎng)度為8和32的rank操作,即存儲(chǔ)到目前位置為止,前面1的個(gè)數(shù)。例如查詢(xún)B[6]中第1個(gè)位置h的1的個(gè)數(shù),則rank(h)=C[1]+D[1*4+2]+_mm_popcnt_u64(B[6]>>7)=6+4+1=11。其中“_mm_popcnt_u64”表示SSE4.2指令集的一條內(nèi)部指令,表示當(dāng)前位置到初始位置1的個(gè)數(shù)。接下來(lái)介紹O(1)時(shí)間復(fù)雜度的Rank操作具體實(shí)現(xiàn)過(guò)程,如圖5所示。圖中是例子中Rank操作的一般拓展:哈希表共存儲(chǔ)n個(gè)key-value對(duì),對(duì)于每個(gè)D向量,存儲(chǔ)長(zhǎng)度為s位,所用位數(shù)占log2r,每個(gè)C向量,存儲(chǔ)長(zhǎng)度為r位,所占位數(shù)是log2n,所以D向量共占比特,C向量共占比特,故額外空間共有M=nslog2r+nrlog2n---(3)]]>當(dāng)計(jì)算第m個(gè)位置的rank值時(shí),其中m=i*r+j*s+k,其中0≤k<s,可以利用以下公式進(jìn)行計(jì)算:C[i]=Σk=0ir-1B[k]---(4)]]>D[i,j]=Σk=irir+js-1B[k]---(5)]]>rank(B,m)=C[i]+D[i,j]+rank(Bi*r+j*s,k)(6)其中,rank(Bi*r+j*s,k)表示從第i*j+j*s個(gè)位置到第m個(gè)位置為止,1的個(gè)數(shù),示意圖為圖6。綜上所述,Rank-select算法可以很好地實(shí)踐在壓縮鄰接表結(jié)構(gòu)上,能有效壓縮空間。在靜態(tài)哈希表中也需要進(jìn)一步優(yōu)化空間效率,故本發(fā)明旨在利用Rank-select算法實(shí)現(xiàn)新型靜態(tài)哈希表的構(gòu)建與訪問(wèn)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供一種高效的靜態(tài)哈希表實(shí)現(xiàn)方法及系統(tǒng),能夠利用Rank-select算法實(shí)現(xiàn)新型靜態(tài)哈希表的構(gòu)建與訪問(wèn)。本發(fā)明可以將靜態(tài)哈希表進(jìn)行有效的壓縮,并且可以實(shí)現(xiàn)直接訪問(wèn)。圖7是傳統(tǒng)哈希表的存儲(chǔ)方式,H代表哈希桶的大小,n代表關(guān)鍵字個(gè)數(shù)。按照指針占4個(gè)字節(jié),整型占用4個(gè)字節(jié)的空間,所占空間共有4H+8n字節(jié)。前述內(nèi)容介紹了O(1)復(fù)雜度的rank操作的具體過(guò)程,為了便于計(jì)算機(jī)實(shí)現(xiàn),本發(fā)明結(jié)合計(jì)算機(jī)的存儲(chǔ)結(jié)構(gòu),設(shè)計(jì)了一種O(1)復(fù)雜度的rank操作具體實(shí)現(xiàn)方式,這也是設(shè)計(jì)基于Rank操作的哈希表壓縮方案中的基本思想。實(shí)驗(yàn)中取r=256,s=64,C[i]用一個(gè)int表示,D[i]用一個(gè)char表示,則額外占用的空間是:M=nslog2r+nrlog2n=ns*8+nr*32=n64*8+n256*32=n4]]>基于Rank操作的哈希壓縮算法則將原來(lái)的指針換為是一個(gè)二進(jìn)制向量B,首先需要設(shè)置哈希表的大小hash_bits,關(guān)鍵字key存儲(chǔ)時(shí),需要先做模運(yùn)算h=keymod(hash_bits)。通過(guò)計(jì)算rank(h)的值,從而不斷將其映射到存儲(chǔ)單元,如圖8所示。由前述可知,需要浪費(fèi)額外空間是比特(H為哈希桶的大小),所以總共的存儲(chǔ)空間為字節(jié),空間比原來(lái)大大減少。為方便靜態(tài)哈希表的存儲(chǔ),建立以下的結(jié)構(gòu)體以供后續(xù)使用:CB{CDbitmap[4]}每一個(gè)CB是一個(gè)結(jié)構(gòu)體,表示哈希表結(jié)構(gòu),包含三個(gè)變量。C表表示存儲(chǔ)固定長(zhǎng)度r的rank操作,D表表示存儲(chǔ)固定長(zhǎng)度s的rank操作,C表為整型,D表為char型(D表和C表也可設(shè)置為其他類(lèi)型,只要能將固定長(zhǎng)度r或s位rank操作的位數(shù)存儲(chǔ)上即可)。為方便計(jì)算機(jī)存儲(chǔ),設(shè)置r=256,s=64。bitmap是一個(gè)大小為4的無(wú)符號(hào)的長(zhǎng)整型數(shù)組,bitmap[i](i=0,1,2,3)表示bitmap的某個(gè)元素。由于每一個(gè)無(wú)符號(hào)的長(zhǎng)整型占用64位大小,所以,一個(gè)bitmap數(shù)組占用256位,正好是本文中C表存儲(chǔ)的rank操作的長(zhǎng)度,而每一個(gè)bitmap的元素值正好是D表存儲(chǔ)的rank操作的長(zhǎng)度。建立哈希表CB數(shù)組,假設(shè)哈希表某個(gè)元素CB[j],則該元素結(jié)構(gòu)體中的值可以表示為CB[j].C,CB[j].D,CB[j].bitmap[i](i=0,1,2,3)。為了便于描述C表和D表,下面的CB[j].C和C[j]表示同等含義,CB[j].D和D[j]表示同等含義。為詳細(xì)描述本發(fā)明的內(nèi)容,本節(jié)先介紹構(gòu)建哈希表及其訪問(wèn)系統(tǒng)的幾大部件和流程過(guò)程,隨后介紹具體的構(gòu)建哈希表和訪問(wèn)哈希表的主要過(guò)程。本發(fā)明中,構(gòu)建哈希表及其訪問(wèn)系統(tǒng)主要包含以下部件,如圖9所示:1)系統(tǒng)預(yù)處理部件:設(shè)定哈希桶大小hash_bit,生成多個(gè)數(shù)據(jù)對(duì),key[i]和value[i]相對(duì)應(yīng)于關(guān)鍵字和值。2)構(gòu)建哈希表部件:根據(jù)key[i]值,利用rank操作構(gòu)建哈希表,并計(jì)算C表和D表。3)存儲(chǔ)信息部件:根據(jù)C表和D表,計(jì)算rank(h),其中h=keymod(hash_bits),并根據(jù)rank(h)的值存儲(chǔ)相應(yīng)的key[i]和value[i]。4)訪問(wèn)信息部件:根據(jù)所要查詢(xún)的的值key,判斷哈希表中是否存在該元素,若存在,則在對(duì)應(yīng)存儲(chǔ)位置查詢(xún)并返回value值,否則,訪問(wèn)失敗。5)返回信息部件:根據(jù)上一步所得的結(jié)果,返回結(jié)果信息。以上介紹了構(gòu)建哈希表及其訪問(wèn)系統(tǒng)的各部件,為了便于理解其構(gòu)建和訪問(wèn)的過(guò)程,方便計(jì)算機(jī)存儲(chǔ),其rank操作的計(jì)算過(guò)程可以用以下的偽代碼表示:上述rank操作的計(jì)算過(guò)程用自然語(yǔ)言描述如下:1)查詢(xún)變量B中第i位前共有多少個(gè)1,首先將下標(biāo)i與63做與運(yùn)算的值賦值給k,再將下標(biāo)i右移8位的值賦值給i1,再將下標(biāo)i右移6位并減去i1左移2位的值賦值給i2,則i1為C表對(duì)應(yīng)的下標(biāo),下標(biāo)i右移6是D表對(duì)應(yīng)的下標(biāo)。2)將變量B中從下標(biāo)為(i1<<8+i2<<6)開(kāi)始,(i1<<8+i2<<6+k-1)結(jié)束的這段變量賦值到e中。3)最終返回值為C[i1]、D[i>>6]與_mm_popcnt_u64(e)的總和,即為變量B中第i位前1的個(gè)數(shù),也是變量B的rank(i)操作。rank操作的計(jì)算過(guò)程在哈希表的構(gòu)建和訪問(wèn)中都會(huì)頻繁用到,針對(duì)前文中對(duì)C表和D表中的具體實(shí)現(xiàn),以下介紹的哈希桶的大小不少于28,均利用上面的rank操作來(lái)存儲(chǔ)和訪問(wèn)數(shù)據(jù)。本發(fā)明分為構(gòu)建哈希表和查詢(xún)關(guān)鍵字兩個(gè)過(guò)程,所以針對(duì)這兩個(gè)過(guò)程簡(jiǎn)述其基于rank操作的哈希表存儲(chǔ)和訪問(wèn)的具體步驟。1.基于rank操作的哈希表存儲(chǔ)算法的具體步驟:1)將預(yù)處理的數(shù)據(jù)分為key和value數(shù)組,key[i]、value[i]與關(guān)鍵字、鍵值相對(duì)應(yīng)。2)預(yù)先一次性導(dǎo)入key值至bitmap中。設(shè)key-value對(duì)共有num個(gè)元素,則CB表的大小為先定義哈希桶的數(shù)量為hash_bit,hash_bit值為CB表的大小clength和28的乘積。對(duì)每個(gè)哈希桶內(nèi)分配4個(gè)大小的bitmap(即含有4個(gè)元素的bitmap),每個(gè)bitmap元素存儲(chǔ)64位的數(shù)據(jù),初始化設(shè)置為各位均為0,如圖10所示。按照時(shí)間度O(1)的rank操作進(jìn)行記錄key數(shù)組的數(shù)據(jù)內(nèi)容。先對(duì)key與hash_bit取模得到h,確保落在哈希桶內(nèi);然后將h存儲(chǔ)在哈希桶對(duì)應(yīng)位置上,按照如下公式記錄h的位置,直到所有的key值均依次記錄位置。q=h&255CB[h>>8].bitmap[q>>6]|=(1<<(q&63))(7)3)存儲(chǔ)計(jì)算C數(shù)組和D數(shù)組。由于第二步相當(dāng)于按照h值的大小,記錄所有key值的相應(yīng)位置信息,所以可利用前述的rank操作從哈希表CB[0]開(kāi)始記錄C數(shù)組和D數(shù)組的相應(yīng)信息,其中C[i]表示前面CB[i-1]個(gè)哈希桶內(nèi)1的個(gè)數(shù),CB[i].D[1]表示CB[i].bitmap[0]中1的個(gè)數(shù),……CB[i].D[3]表示CB[i].bitmap[0]到CB[i].bitmap[2]中1的個(gè)數(shù)。4)利用C表和D表信息,利用前文中的rank操作的算法計(jì)算每個(gè)key值對(duì)應(yīng)的rank值。5)利用rank值記錄每個(gè)哈希桶內(nèi)元素個(gè)數(shù),按照哈希表C的順序疊加記錄。利用rank值作為順序存儲(chǔ)key、value值。若不同的key有同一rank值,即落在同一個(gè)哈希桶內(nèi)出現(xiàn)了哈希沖突?,F(xiàn)在的rank值有了第二層意義,即對(duì)于h=keymod(hash_bit)進(jìn)行了排序,利用rank值代表排序的位置,那么進(jìn)行存儲(chǔ)key-value對(duì)的時(shí)候,其rank值相同時(shí),說(shuō)明其哈希桶內(nèi)存在2個(gè)以上的元素,為了便于存儲(chǔ),首要順序按照rank值大小順序存儲(chǔ),次要順序按照rank值相同依次存儲(chǔ)。6)存儲(chǔ)key、value值到數(shù)組中。2.基于rank操作的哈希表訪問(wèn)算法的具體步驟:1)先對(duì)要查詢(xún)的數(shù)據(jù)key與hash_bit取模得到h。2)計(jì)算q=h&255,判斷CB[h>>8].bitmap[q>>6]和(1<<(q&63))做與運(yùn)算是否為1,即在原來(lái)哈希桶內(nèi)是否有key值。若此步判斷為0,則原哈希表內(nèi)沒(méi)有該key值,查詢(xún)失敗;若此步判斷為1,則原哈希表內(nèi)有該key值,則需要找到value值。3)為了防止哈希沖突,即原哈希表內(nèi)該位置有兩個(gè)及以上的關(guān)鍵字值命中,則在該哈希桶內(nèi)依次判斷是否含有查詢(xún)數(shù)據(jù)key,若包含,返回value值,若不包含,查詢(xún)下一個(gè)關(guān)鍵字,直至關(guān)鍵字為空,查詢(xún)失敗。本發(fā)明的有益效果如下:本發(fā)明利用Rank-select算法實(shí)現(xiàn)新型靜態(tài)哈希表的構(gòu)建與訪問(wèn),能夠?qū)o態(tài)哈希表進(jìn)行壓縮,可支持對(duì)靜態(tài)哈希表的訪問(wèn),能夠進(jìn)一步優(yōu)化空間效率;該方案可用于內(nèi)容過(guò)濾、信息安全等領(lǐng)域。附圖說(shuō)明圖1是二進(jìn)制串進(jìn)行存儲(chǔ)鄰接樹(shù)結(jié)構(gòu)示意圖。圖2是rank操作示例圖。圖3是利用rank-select算法對(duì)二叉樹(shù)節(jié)點(diǎn)進(jìn)行存儲(chǔ)示例圖。圖4是O(1)時(shí)間復(fù)雜度的Rank操作示例圖。圖5是O(1)時(shí)間復(fù)雜度的Rank操作實(shí)現(xiàn)圖。圖6是計(jì)算第m個(gè)位置的rank操作示意圖。圖7是傳統(tǒng)哈希表的存儲(chǔ)方式示意圖。圖8是基于Rank操作的緊湊哈希表存儲(chǔ)方式示意圖。圖9是基于rank操作靜態(tài)哈希表構(gòu)建及訪問(wèn)的系統(tǒng)部件圖。圖10是哈希表存儲(chǔ)結(jié)構(gòu)示意圖。圖11是哈希桶示例展示圖。具體實(shí)施方式下面通過(guò)具體實(shí)施例對(duì)本發(fā)明做進(jìn)一步說(shuō)明。本節(jié)主要針對(duì)
發(fā)明內(nèi)容中的具體步驟來(lái)介紹,針對(duì)所要存儲(chǔ)的具體數(shù)據(jù)來(lái)分析,分為基于rank操作的哈希表存儲(chǔ)過(guò)程和基于rank操作的哈希表訪問(wèn)過(guò)程。1.基于rank操作的哈希表存儲(chǔ)過(guò)程示例:下面舉例說(shuō)明前述存儲(chǔ)步驟。假設(shè)哈希桶的大小hash_bit=29,要存儲(chǔ)的數(shù)據(jù)見(jiàn)下表1,那么相應(yīng)的h值也見(jiàn)下表所示。表1哈希表存儲(chǔ)數(shù)據(jù)key、value及h值key151365257value1234h1165257key取模后的數(shù)據(jù)按照二進(jìn)制表示如圖11左上顯示,所以對(duì)應(yīng)的哈希表如圖11下方所示,所以,C[0]=0,C[1]=2,C[2]=3;CB[0].D[0]=0,CB[0].D[1]=1,CB[0].D[2]=2,CB[0].D[3]=2,CB[1].D[0]=0,CB[1].D[1]=1,CB[1].D[2]=1,CB[1].D[3]=1;存儲(chǔ)key,value值至二維數(shù)組中,按照rank(h)值排序可知,rank(h)=1時(shí)有兩個(gè)key映射到同一位置,見(jiàn)表2,則存儲(chǔ)時(shí),坐標(biāo)變化見(jiàn)表3,其中idx是累加前幾項(xiàng)所得到的,代表其存儲(chǔ)終結(jié)key坐標(biāo)的一半減去1,則存儲(chǔ)key、value的一維數(shù)組見(jiàn)表4,其中,idx1表示數(shù)組的坐標(biāo)編號(hào),key的坐標(biāo)為偶數(shù),value坐標(biāo)為奇數(shù)。表2rank(h)值及其數(shù)目rank(h)123count211表3累加數(shù)目得到坐標(biāo)idxrank(h)123idx234表4一維數(shù)組idx1存儲(chǔ)key、value值idx101234567keyorvalue11513265325742.基于rank操作的哈希表查詢(xún)過(guò)程示例:哈希表建立過(guò)程依照存儲(chǔ)例子所示,假使要查詢(xún)key=513是否在哈希表中,首先計(jì)算h=1q=1,CB[h>>8].bitmap[q>>6]=1成立,由于該位置有兩個(gè)key值命中,則查找idx1[0]和idx1[2]是否與513相等,由于idx1[2]=513,則返回value=idx1[3]=2,查詢(xún)成功?;谏鲜龇桨冈O(shè)計(jì),下面將基于Rank操作的哈希表壓縮算法與二分查找算法、線性探測(cè)哈希算法和二分哈希算法進(jìn)行比較,其中測(cè)試數(shù)據(jù)是1000萬(wàn)個(gè)key-value對(duì),key和value為隨機(jī)生成的32位無(wú)符號(hào)整數(shù),共占用76.294MB存儲(chǔ)空間。待查詢(xún)數(shù)據(jù)是1000萬(wàn)個(gè)隨機(jī)生成的32位無(wú)符號(hào)整數(shù),設(shè)置查詢(xún)命中率為1%。實(shí)驗(yàn)測(cè)試環(huán)境是64位WIN7操作系統(tǒng),IntelCPUi5,4GB內(nèi)存。由于哈希表桶大小這一參數(shù)可以進(jìn)行調(diào)節(jié),所以實(shí)驗(yàn)中針對(duì)不同的算法,哈希表桶大小也做了不同的測(cè)試?;赗ank操作的哈希表壓縮算法可以利用SSE指令集中_mm_popcnt_u64等指令支持64以上的rank位操作,該實(shí)驗(yàn)測(cè)試中使用SSE指令集與不使用的SSE指令集的算法都做了相對(duì)應(yīng)的比較。實(shí)驗(yàn)一:使用SSE指令集與不使用SSE指令集的基于Rank操作的哈希表壓縮算法如表5和6所示,兩種算法的額外空間都隨著哈希表桶的增大而增大,查詢(xún)速度在哈希表桶為229時(shí)速度最大。使用SSE指令集比不使用SSE指令集的基于Rank操作的哈希表壓縮算法在相同大小哈希表桶的情況下,查詢(xún)速度明顯占優(yōu)勢(shì)。這說(shuō)明在硬件中實(shí)現(xiàn)的rank位操作要優(yōu)于軟件設(shè)計(jì)的rank位操作。表5基于Rank操作的哈希表壓縮算法(RankforSSE)哈希表桶大小Key-value空間(MB)額外空間(MB)查詢(xún)速度(萬(wàn)次/秒)22476.29431.265177922576.29438.023246322676.29445.478290622776.29456.802327822876.29477.490400022976.294117.838456623076.294198.0144000表6基于Rank操作的哈希表壓縮算法(RankNoneSSE)哈希表桶大小Key-value空間(MB)額外空間(MB)查詢(xún)速度(萬(wàn)次/秒)22476.29431.26574422576.29438.023130322676.29445.478200022776.29456.802278522876.29477.490336722976.294117.838425523076.294198.0143773實(shí)驗(yàn)二:二分查找算法、哈希二分查找算法和線性探測(cè)哈希算法表7二分查找算法(CBinarySearch)Key-value空間(MB)額外空間(MB)查詢(xún)速度(萬(wàn)次/秒)76.2940172表8哈希二分查找算法(CHashBinarySearch)哈希表桶大小Key-value空間(MB)額外空間(MB)查詢(xún)速度(萬(wàn)次/秒)22476.29464160022576.294128177622676.294256188322776.2945121560表9線性探測(cè)哈希算法(CLinearProbe)通過(guò)以上3個(gè)實(shí)驗(yàn),可以看出:1:二分查找算法不需要額外空間和哈希桶大小參數(shù),但是查詢(xún)速度比較慢。2:線性探測(cè)算法在哈希桶大小226為時(shí),能達(dá)到3558萬(wàn)次/秒的查詢(xún)速度,效率在三種算法中最優(yōu),但是額外空間占用較大,達(dá)到435.706MB。3:哈希二分查找算法中在哈希桶大小226為時(shí),能達(dá)到1883萬(wàn)次/秒的查詢(xún)速度,速度劣于線性探測(cè)算法,但是額外空間較小,為256MB。實(shí)驗(yàn)三:基于Rank操作壓縮哈希表的壓縮算法與實(shí)驗(yàn)二中算法對(duì)比表10五種哈希壓縮算法實(shí)驗(yàn)對(duì)比表通過(guò)以上實(shí)驗(yàn)對(duì)比,可以看出:基于Rank操作的哈希表壓縮算法在查詢(xún)速度和占用空間方面都有很大優(yōu)勢(shì),其速度和額外空間都遠(yuǎn)遠(yuǎn)超過(guò)其他三種算法。使用SSE指令集時(shí),基于Rank操作的哈希表壓縮算法在哈希桶大小229為時(shí),能達(dá)到4566萬(wàn)次/秒的查詢(xún)速度,額外空間僅占用117.838MB。以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非對(duì)其進(jìn)行限制,本領(lǐng)域的普通技術(shù)人員可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書(shū)所述為準(zhǔn)。當(dāng)前第1頁(yè)1 2 3 
當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1