簡體   English   中英

C中關聯集合的簡單空間高效實現?

[英]Simple space efficient implementations of an associative collection in C?

我正在尋找一個關聯集合,它支持在至少O(Log(N))時間內按鍵(刪除不重要)檢索和插入值,並且在代碼大小和運行方面都具有非常低的內存開銷時間內存消耗。

我這樣做是為了用C編寫的小型嵌入式應用程序,所以我試圖最小化所需的代碼量和消耗的內存量。

如果它不是用C ++編寫的,那么Google稀疏哈希數據結構就有可能,而且更簡單。

我所知道的大多數哈希表實現使用了相當多的額外空間,需要至少兩倍於鍵值總數的空間,或者每個條目需要額外的指針(例如桶鏈式哈希算法)。 在我的結構中,鍵值對只是兩個指針。

目前我正在使用已排序的鍵/值對數組,但插入是O(N)。 我不禁想到必須有一種聰明的方法來改善插入的攤銷運行時間,例如通過在組中進行插入,但我沒有取得任何成功。

我認為這在某些圈子中一定是一個比較着名的問題,所以為了使這不太主觀,我想知道上述問題最常見的解決辦法是什么?

[編輯:]

一些可能相關的其他信息:

  • 鍵是整數
  • 值的數量可以很小,從1到2 ^ 32。
  • 使用模式是不可預測的。
  • 我希望盡可能降低內存消耗(例如,所需內存大小加倍,不太理想)

查看二叉搜索樹並克服最壞情況(搜索和插入都具有O(n)復雜度)使用平衡樹

您可以使用不使用鏈接的哈希表,例如線性探測或布谷鳥哈希方案。 支持實現只是一個數組,負載因子大約為0.5,開銷不會太差,實現復雜性(至少對於線性或二次探測)並不算太多。

如果你想要一個良好的二進制搜索樹實現,它具有出色的性能保證,並且不易編碼,請考慮查看splay樹。 它們保證了攤銷的 O(lg n)查找,並且每個節點只需要兩個指針。 平衡步驟也比大多數平衡BST更容易。

我可能會使用帶有雙哈希的哈希表來解決沖突。 一般的想法是哈希你的原始值,如果碰撞做了第二個哈希,給出一個步驟值,你將用於遍歷數組來找到放置值的位置。 這很好地利用了內存,因為它沒有指針開銷,並且在比線性探測更高的負載因子下保持合理的效率。

編輯:如果您想要改變現在正在做的事情,一種可能性是處理集群中的插入:保留一個已排序的數組,以及一個單獨的新插入集合。 當新插入的集合變得太大時,將這些項合並到主集合中。

對於二級收藏,您有幾個選擇。 您可以使用未排序的數組,並進行線性搜索 - 並且只是限制其大小,所以(比如)log(M),其中M是主數組的大小。 在這種情況下,整體搜索仍為O(log N),不會產生任何內存開銷,並且可以非常快速地保留大多數插入。 當您將集合合並在一起時,您(通常)希望對輔助集合進行排序,然后與主集合合並。 這使您可以在次要集合中的項目數上分攤線性合並。

或者,您可以將樹用於輔助集合。 這意味着新插入的項目使用額外的存儲指針,但(再次)保持這個大小限制開銷。

暫無
暫無

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

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