簡體   English   中英

如何減少哈希表插槽中的指針/地址寬度?

[英]How to reduce the pointer/address width in a hash table slot?

假設我們有一個使用鏈表(鏈接列表)的哈希表來解決哈希沖突。 每個哈希表插槽將具有一個指向鏈接列表的第一個節點的指針字段。 該指針將占用4或8個字節,具體取決於x86或x64 OS。

對於一些具有百萬個插槽的大型哈希表,指針將消耗大量的內存資源。 對於硬件實現,我們可以在FPGA上自定義指針/地址寬度以節省內存。 我的問題是,對於軟件實現,是否還可以將指針大小減小到3個字節?

如果您沒有首先實現哈希表,則可以將溢出列表的指針大小開銷減少到0個字節。

實際上,實現哈希表沒有任何缺點,例如,如果表的一個插槽已包含值,則可以應用“某種策略”來查找另一個空插槽。 如果在寫入時這樣做,則讀取功能需要執行模擬步驟以找到正確的讀取位置。

實際上,此方法的性能不會比外部溢出列表差,因為在具有那些溢出列表的情況下,您要執行的操作是在溢出列表中執行線性搜索。 使用就地哈希表,您可以執行-根據選擇的策略,還可以進行線性探測。

這樣做的一個想法是擁有一組哈希鍵而不是一個。 (通常為2,則稱為Double哈希)。 如果您寫並且表的槽位已被占用,則使用集合中的下一個哈希鍵,然后重試,直到哈希鍵用盡或找到空白為止。 使用N個哈希鍵,您可以執行N個步驟。

在這種情況下,為了進行讀取,您嘗試查找條目,並按照與寫操作相同的順序應用哈希鍵集,並探查是否需要此條目,就像探測溢出列表一樣。

由於哈希表只有在填充率較低時才“有意義”,因此該策略實際上節省了溢出列表實現所需的大量內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM