雜湊表應用(鏈位址法)

2021-06-02 19:50:59 字數 1477 閱讀 6205

最近專案中碰到這麼乙個問題。

opc客戶端中存在已知點名的20000個點,其中點名是由字母和數字組成,比如pn110,pn112,pn113,pn114...pn200...pn900...

將dcs伺服器中的20000個點加到opc客戶端中。如果遇到相同的點名,就不加入,不相同就加入。比如dcs伺服器中有點pn110,pn111,則opc客戶端中只有乙個pn110,乙個pn111。

這裡涉及到opc客戶端中的20000個點名跟dcs伺服器的20000個點名進行比較問題,因為是工業自動化的問題,對實時性要求比較高,換句話說就是對比的時間複雜度要小才符合要求。

有些人會想到一般的比較方法,這個要花費幾分鐘時間。想到hash表,如果你對hash不是很了解,請看資料結構hash用在什麼場合,這裡我就不總結了,實際上這個是非常重要的。

書上是這麼說的:理想的情況是希望不經過任何比較,一次訪問便能得到所查詢記錄,就必須在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使每個關鍵字和結構中唯一的儲存位置相對應。

直接帖**:

class cbranch

~cbranch()

} void addtag( cextag* ptag )

int m_nlayer;

extaglist m_tags;

cbranch* m_pbranches;

};void copcserverview::onoperatecheck()

else if (ptag->m_strname.getlength() == 1)

else if(ptag->m_strname.getlength() == 2)

else if(ptag->m_strname.getlength() >= 3)}}

} }bool bnotexist = checktagname(&brhtaglist[0], ptagfind, false );

if (!bnotexist)

bool copcserverview::createhash(cbranch *pbranches, int nlayer)

createhash(&(pbrh+i)->m_pbranches[0], nlayer+1);

} }return true;

}

關鍵字為取點名後面三位,比如pn1234,則取234,其中'2』對應ascii值為0x50,乙個unsigned char最大表示0-255,所以建hash表大小為256。利用衝突法中的鍊錶位址法,建立三次hash表,每個鍊錶中點分別對應256中情況。

其中裡面的邏輯問題說明cchannel(通道),cdevice(裝置),cgroup(組),cextag(標籤),乙個通道下面有多個裝置,乙個裝置下有多個組,乙個組有多個標籤。

總結:hash表的問題關鍵在關鍵字的確定,hash表的建立(建立後給它賦值具體的內容),處理衝突。

最後**是老同志寫的,我只是理解了一下!

雜湊表 開放位址法

雜湊表的查詢過程和建表過程相似。假設給定的值為k,根據建表時設定的雜湊函式h,計算出雜湊位址h k 若表中該位址單元為空,則查詢失敗 否則將該位址中的結點與給定值k比較。若相等則查詢成功,否則按建表時設定的處理衝突的方法找下乙個位址。如此反覆下去,直到某個位址單元為空 查詢失敗 或者關鍵字比較相等 ...

hash table 解決雜湊衝突(鏈位址法)

此 運算雜湊值的運算公式f x x 14 當然也可以通過別的函式運算其雜湊值,由於雜湊值會直接作為下標,因而其雜湊值盡量控制在0 15之間,如若雜湊表過長則會造成空間的浪費,一般來說資料個數 0.75 雜湊表長,比較適宜。2020.1.20 在這個特殊的日子,我決定痛改前非給你們解釋一下我的 新增了...

資料結構 雜湊表(除留取餘法 鏈位址法)

include using namespace std 雜湊函式的構造方法 除留取餘法 typedef struct node node typedef struct hash table hash table 初始化雜湊表 hash table inithashtable 在雜湊表中查詢資料 no...