使用雜湊表快速查詢字串的一種解決方案

2021-07-22 14:13:28 字數 1747 閱讀 3755

必備知識:

什麼是雜湊表?

雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

雜湊表hashtable(key,value) 的做法其實很簡單,就是把key通過乙個固定的演算法函式既所謂的雜湊函式轉換成乙個整型數字,然後就將該數字對陣列長度進行取餘,取餘結果就當作陣列的下標,將value儲存在以該數字為下標的陣列空間裡。

而當使用雜湊表進行查詢的時候,就是再次使用雜湊函式將key轉換為對應的陣列下標,並定位到該空間獲取value,如此一來,就可以充分利用到陣列的定位效能進行資料定位

本方案結合以上兩種方式的特點,分三步建立完成乙個雜湊表,具體過程如下圖所示:

簡要說明:

- 第一步:由雜湊函式生成的雜湊值與總儲存量進行求模,所得結果a即為該資料在雜湊表中的位置。如果該位置為空,則將該資料的md5值填入此處,但是由於資料碰撞,不同資料的雜湊值可能會得到相同的a值,此時僅將碰撞次數加1,直至迴圈結束。

- 第二步:根據第一步得到的碰撞次數,申請同等長度的快取空間buffer。在第二次迴圈中,按序迴圈,依次檢查每一處是否為空,如果為空,將此位置下標b記錄到快取空間buffer中,直至迴圈結束。

- 進行第三次迴圈,如果a處已存在資料,則從buffer中按序摘取乙個下標b,將該資料的md5值與原始檔案下標值填入此處,然後再將下標b插入到a處資訊的指標域,以此形成鍊錶結構。

示例偽**如下:

int ihitcnt = 0;//碰撞次數

for(uint jj = 0;jj < 3;jj++)

pfreeoffset[pp++] = ii;}}

else

else

phashstruct pnewhashst = mp_hashptr + pfreeoffset[pp];//從公共溢位區摘乙個空白的區域,並將其加入到鍊錶中

memcpy(pnewhashst->chmd5,pmd5,md5_length);

pnewhashst->nextoffset = mp_hashptr[ihashpos].nextoffset;

mp_hashptr[ihashpos].nextoffset = pfreeoffset[pp];

pp++;}}

else}}

if (jj == 0)

zeromemory(pfreeoffset,sizeof(int)*ihitcnt);

}if (jj == 1)

}delete pfreeoffset;

注:

1. 本方案中的value為資料的md5值,長度固定為32位。

2. 鍊錶的節點的指標域儲存的是指向下乙個節點的陣列偏移量,讀取節點內容時需要使用陣列首位址+偏移量來得到真正的節點內容

總結:

本方案結合了兩種碰撞處理的優點,減少記憶體碎片及避免堆積現象出現。提高了查詢效率。

缺點是:建表過程需要經過3次迴圈才可以完成。可能會增加等待時間,降低客戶體驗。

by jared kin

python快速查詢字串中的某個字元

import re text user lijian desktop workspace project v501 name searchcontext numlist m.start for m in re.finditer searchcontext,text print numlist比如我們...

一種快速的字串匹配演算法

快速字串查詢函式 目前比較流行的字串有kmp與bm演算法,實際上kmp演算法在使用的時候比strchr快不了多少,而bm演算法也 大約只有kmp演算法的3 5倍。這裡介紹乙個快速字串查詢函式。舉乙個例子 hello,world 中查詢 word 子串,可以先把兩個字串按照首位元組對好 hello,w...

字串查詢匹配演算法的一種Java實現

1 kmp演算法 kmp演算法是一種改進的 字串匹配 演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為 克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就...