本技術(shù)涉及數(shù)據(jù)處理,特別是涉及一種哈希表的數(shù)據(jù)插入方法、系統(tǒng)及電子設(shè)備。
背景技術(shù):
1、在計算機(jī)算法、數(shù)據(jù)庫管理和信息處理技術(shù)領(lǐng)域,布谷鳥哈希是一種常用的快速查表和插入的數(shù)據(jù)結(jié)構(gòu),其通過哈希值選擇哈希桶和子槽的方式來存儲鍵值對。
2、布谷鳥哈希在插入新的鍵值對且出現(xiàn)哈希碰撞時,能夠通過子槽替換來解決哈希碰撞的問題,但由于子槽的替換次數(shù)受限于配置的閾值,替換次數(shù)越大,哈希表的負(fù)載因子也會逐漸上升,當(dāng)負(fù)載因子超過一定值后,例如超過80%,繼續(xù)插入新的鍵值對時,哈希表中空閑槽位減少,子槽的替換次數(shù)顯著增加,導(dǎo)致插入新鍵值對時的成功率呈指數(shù)級下降,降低了哈希表的利用率。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)實(shí)施例提供一種哈希表的數(shù)據(jù)插入方法、系統(tǒng)及電子設(shè)備,能夠提高數(shù)據(jù)的添加效率。
2、為解決上述技術(shù)問題,本技術(shù)實(shí)施例提供以下技術(shù)方案:
3、第一方面,本技術(shù)實(shí)施例提供一種哈希表的數(shù)據(jù)插入方法,哈希表包括第一級表和第二級表,第一級表包括多個哈希桶,哈希桶包括多個子槽,第二級表包括多個子槽,方法包括:
4、對第一級表進(jìn)行深度擴(kuò)展,得到擴(kuò)展后的第一級表;
5、獲取第一鍵值對,其中,鍵值對包括第一關(guān)鍵字和第一數(shù)據(jù)項;
6、根據(jù)第一關(guān)鍵字,獲取擴(kuò)展后的第一級表中的一個哈希桶的空閑子槽、第一關(guān)鍵字對應(yīng)的第一簽名值;
7、獲取第一地址指針,其中,第一地址指針用于存儲第二級表的一個子槽的地址;
8、將第一關(guān)鍵字對應(yīng)的第一簽名值、第一地址指針存儲于第一級表的哈希桶的空閑子槽;
9、根據(jù)第一地址指針,將第一關(guān)鍵字和第一數(shù)據(jù)項存儲于第二級表。
10、在一些實(shí)施例中,對第一級表進(jìn)行深度擴(kuò)展,包括:
11、獲取負(fù)載因子;
12、獲取哈希表的最大深度;
13、基于負(fù)載因子、哈希表的最大深度,擴(kuò)展第一級表的深度,其中,第一級表的深度=(1/σ)*d,σ為負(fù)載因子,d為哈希表的最大深度。
14、在一些實(shí)施例中,哈希桶包括主哈希桶和副哈希桶,根據(jù)第一關(guān)鍵字,獲取擴(kuò)展后的第一級表的一個哈希桶的空閑子槽,包括:
15、根據(jù)第一關(guān)鍵字,獲得主哈希桶的地址、副哈希桶的地址,根據(jù)主哈希桶地址獲得主哈希桶,根據(jù)副哈希桶地址獲得副哈希桶,其中,主哈希桶和副哈希桶均包括多個子槽,每一個子槽對應(yīng)一個備選桶,子槽用于存儲第一簽名值;
16、基于主哈希桶、副哈希桶、主哈希桶對應(yīng)的備選桶都不存在空閑子槽時,判斷副哈希桶對應(yīng)的備選桶內(nèi)是否存在空槽;
17、若副備選桶對應(yīng)的備選桶內(nèi)存在空閑子槽,則根據(jù)新增元素優(yōu)先級原則,確定第一剔除子槽和第一備選桶,其中,第一剔除子槽為副備選桶內(nèi)多個子槽中的一個,第一備選桶為第一剔除子槽對應(yīng)的備選桶;
18、將第一剔除子槽的元素添加到第一備選桶內(nèi),將第一剔除子槽作為第一簽名值存儲的子槽;
19、若副備選桶對應(yīng)的備選桶內(nèi)不存在空閑子槽,則根據(jù)剔除元素優(yōu)先級原則,確定副備選桶內(nèi)對應(yīng)的第二剔除子槽和第二備選桶,其中,第二剔除子槽為副備選哈希桶中的一個子槽,第二備選桶為第二剔除子槽對應(yīng)的備選桶;
20、將副備選哈希桶內(nèi)的所有子槽按序循環(huán)移位后,覆蓋備選哈希桶,剔除次數(shù)加一;
21、將第二備選桶替換成副備選桶,判斷副備選桶內(nèi)是否存在空槽,直至副備選桶對應(yīng)的備選桶內(nèi)存在空閑子槽。
22、在一些實(shí)施例中,哈希表包括若干域段,每一域段包括多個哈希桶,新增元素優(yōu)先級原則包括哈希桶的空閑子槽數(shù)量最多原則、域段的空閑子槽數(shù)量最多原則、尾部優(yōu)先原則;
23、根據(jù)新增元素優(yōu)先級原則,確定第一剔除子槽和第一備選桶,包括:
24、根據(jù)哈希桶的空閑子槽數(shù)量最多原則,確定第三備選桶,其中,第三備選桶為副哈希桶對應(yīng)的所有備選桶中空閑子槽數(shù)量最多的備選桶;
25、若第三備選桶的個數(shù)大于預(yù)設(shè)個數(shù),則根據(jù)域段的空閑子槽數(shù)量最多原則,確定第四備選桶,其中,第四備選桶為第三備選桶中的備選桶;
26、若第四備選桶的個數(shù)大于預(yù)設(shè)個數(shù),則根據(jù)尾部優(yōu)先原則,確定第五備選桶,將第五備選桶作為第一備選桶,其中,第五備選桶為多個第四備選桶中的一個;
27、將第一備選桶對應(yīng)的副哈希桶中的子槽作為第一剔除子槽。
28、在一些實(shí)施例中,剔除元素優(yōu)先級原則包括尾部優(yōu)先剔除原則或首部優(yōu)先剔除原則;
29、根據(jù)剔除元素優(yōu)先級原則,確定副備選桶內(nèi)對應(yīng)的第二剔除子槽和第二備選桶,包括:
30、若剔除元素優(yōu)先級原則為尾部優(yōu)先剔除原則,則將副哈希桶的尾部的第一個子槽作為第二剔除子槽;
31、若剔除元素優(yōu)先級原則為首部優(yōu)先剔除原則,則將副哈希桶的首部的第一個子槽作為第二剔除子槽;
32、將第二剔除子槽對應(yīng)的備選桶作為第二備選桶。
33、在一些實(shí)施例中,將副備選哈希桶內(nèi)的所有子槽按序循環(huán)移,包括:
34、依次將副備選哈希桶中的所有子槽向副備選哈希桶的尾部移動一個位置,直至副備選哈希桶內(nèi)的所有子槽都完成移位。
35、在一些實(shí)施例中,方法還包括:
36、若第三備選桶的個數(shù)等于預(yù)設(shè)個數(shù),則將第三備選桶作為第一備選桶;
37、若第四備選桶的個數(shù)等于預(yù)設(shè)個數(shù),則將第四備選桶作為第一備選桶。
38、在一些實(shí)施例中,方法還包括:
39、若主哈希桶存在空閑子槽,副哈希桶不存在空閑子槽,則將第一簽名值和第一地址指針存儲于主哈希桶的空閑子槽;
40、若主哈希桶不存在空閑子槽,副哈希桶存在空閑子槽,則將所第一述簽名值和第一地址指針存儲于副哈希桶的空閑子槽;
41、若主哈希桶、副哈希桶均存在空閑的子槽,則根據(jù)新增元素優(yōu)先級原則,確定哈希桶,并將第一簽名值和第一地址指針插入到哈希桶,其中,哈希桶為主哈希桶、副哈希桶中的其中一個;
42、若主哈希桶不存在空閑的子槽,且副哈希桶不存在空閑子槽,主哈希桶的子槽對應(yīng)的主備選桶存在空閑的子槽,則將第一簽名值和第一地址指針插入到主哈希桶的子槽對應(yīng)的主備選桶的空閑子槽;
43、若主哈希桶不存在空閑子槽,且副哈希桶不存在空閑子槽,主哈希桶的子槽對應(yīng)的主備選桶不存在空閑子槽,副哈希桶的子槽對應(yīng)的副備選桶存在空閑子槽,則將第一簽名值和第一地址指針插入到副哈希桶的子槽對應(yīng)的副備選桶的空閑子槽。
44、在一些實(shí)施例中,方法還包括:
45、獲取第二關(guān)鍵字;
46、對第二關(guān)鍵字進(jìn)行哈希計算,以獲取擴(kuò)展后的第一級表的一個哈希桶的地址、第二簽名值;
47、基于哈希桶的地址,讀取哈希桶內(nèi)的第三簽名值、第二地址指針,其中,第二地址指針用于存儲第二級表的一個子槽地址;
48、若第二簽名值與第三簽名值相同,則基于第二地址指針,獲取第二級表的子槽的第二數(shù)據(jù)項。
49、在一些實(shí)施例中,方法還包括:
50、獲取第二鍵值對,其中,鍵值對包括第三關(guān)鍵字和第三數(shù)據(jù)項;
51、對第三關(guān)鍵字進(jìn)行哈希計算,以獲取擴(kuò)展后的第一級表的一個哈希桶的地址、第四簽名值;
52、基于哈希桶的地址,讀取哈希桶內(nèi)的第五簽名值、第三地址指針,其中,第三地址指針用于存儲第二級表的一個子槽地址;
53、若第四簽名值與第五簽名值相同,則基于第三地址指針,獲取第二級表的子槽的第四關(guān)鍵字;
54、若第三關(guān)鍵字與第四關(guān)鍵字相同,則將第三數(shù)據(jù)項更新到第三地址指針?biāo)赶虻牡诙壉淼淖硬邸?/p>
55、在一些實(shí)施例中,方法還包括:
56、若第二簽名值與第三簽名值不相同,則結(jié)束當(dāng)前獲取第二數(shù)據(jù)項的操作;
57、若第四簽名值與第五簽名值相同,第三關(guān)鍵字與第四關(guān)鍵字不相同,則結(jié)束當(dāng)前將第三數(shù)據(jù)項更新到第二級表的子槽的操作;
58、或者,
59、若第四簽名值與第五簽名值不相同,則結(jié)束當(dāng)前將第三數(shù)據(jù)項更新到第二級表的子槽的操作。
60、第二方面,本技術(shù)實(shí)施例提供一種哈希表的數(shù)據(jù)插入系統(tǒng),哈希表包括第一級表和第二級表,第一級表包括多個哈希桶,哈希桶包括多個子槽,第二級表包括多個子槽,系統(tǒng)包括:
61、哈希表控制單元,用于對第一級表進(jìn)行深度擴(kuò)展,得到擴(kuò)展后的第一級表;
62、哈希計算單元,用于獲取第一鍵值對,其中,鍵值對包括第一關(guān)鍵字和第一數(shù)據(jù)項,根據(jù)第一關(guān)鍵字,獲取擴(kuò)展后的第一級表中的一個哈希桶的空閑子槽、第一關(guān)鍵字對應(yīng)的第一簽名值;
63、指針控制單元,用于獲取第一地址指針,其中,第一地址指針用于存儲第二級表的一個子槽的地址址;
64、第一級表存儲單元,用于存儲第一關(guān)鍵字對應(yīng)的第一簽名值、第一地址指針;
65、第二級表存儲單元,用于存儲第一關(guān)鍵字和第一數(shù)據(jù)項。
66、第三方面,本技術(shù)實(shí)施例提供一種電子設(shè)備,包括:
67、至少一個處理器,以及
68、與至少一個處理器通信連接的存儲器,其中,
69、存儲器存儲有可被至少一個處理器執(zhí)行的指令,指令被至少一個處理器執(zhí)行,以使至少一個處理器能夠執(zhí)行如第一方面的哈希表的數(shù)據(jù)插入方法。
70、本技術(shù)實(shí)施例的有益效果是:區(qū)別于現(xiàn)有技術(shù)的情況下,本技術(shù)實(shí)施例提供的一種哈希表的數(shù)據(jù)插入方法,哈希表包括第一級表和第二級表,第一級表包括多個哈希桶,哈希桶包括多個子槽,第二級表包括多個子槽,方法包括:對第一級表進(jìn)行深度擴(kuò)展,得到擴(kuò)展后的第一級表,獲取第一鍵值對,其中,鍵值對包括第一關(guān)鍵字和第一數(shù)據(jù)項,根據(jù)第一關(guān)鍵字,獲取擴(kuò)展后的第一級表中的一個哈希桶的空閑子槽、第一關(guān)鍵字對應(yīng)的第一簽名值,獲取第一地址指針,其中,第一地址指針用于存儲第二級表的一個子槽的地址,將第一關(guān)鍵字對應(yīng)的第一簽名值、第一地址指針存儲于第一級表的哈希桶的空閑子槽,根據(jù)第一地址指針,將第一關(guān)鍵字和第一數(shù)據(jù)項存儲于第二級表。
71、通過對第一級表進(jìn)行深度擴(kuò)展,得到擴(kuò)展后的第一級表,獲取關(guān)鍵字和數(shù)據(jù)項,基于關(guān)鍵字,獲取哈希桶的地址,獲取擴(kuò)展后的第一級表的一個哈希桶的空閑的子槽、關(guān)鍵字的簽名值,獲取地址指針,將地址指針、簽名值存儲于哈希桶的空閑的子槽,將關(guān)鍵字和數(shù)據(jù)項存儲于地址指針?biāo)赶虻牡诙壉淼淖硬?,能夠提高哈希表的利用率?/p>