簡體   English   中英

在O(1)中實現具有密鑰和基於索引的訪問的哈希表

[英]Implementing hash table with both key and index-based access in O(1)

在.NET中有一個名為NameObjectCollectionBase的數據結構,我正在努力理解。

基本上,它允許輸入任意string =>對象鍵/值對,同時鍵的可能性和值為null。 密鑰可以由多個對象使用。 通過基於索引的訪問和基於字符串的訪問授予訪問權限,而基於字符串的訪問僅返回具有指定鍵的第一個值。

他們承諾的是

add(string, object)        O(1) if no relocation, O(n) otherwise
clear                      O(1)
get(int)                   O(1) corresponds to getkey(int)
get(string)                O(1) returns first object found with given key
getallkeys                 O(n) if objects share a key, it is returned that many times
getallvalues               O(n)
getallvalues(type)         O(n) returns only objects of a given type
getkey(int)                O(1) corresponds to get(int)
haskeys                    O(1) if there are objects with a non-null key
remove(string)             O(n) remove all objects of a given key
removeat(int)              O(n)
set(int, object)           O(1) 
set(string, object)        O(1) sets the value of the first found object with given key
getenumerator              O(1) enumerator over keys
copyto(array, int)         O(n) 

基於索引的訪問與插入順序無關。 但是, get(int)getkey(int)必須相互排列。

我想知道如何實現結構。 在O(1)中同時允許索引和基於密鑰的訪問似乎並非易事。 他們在MSDN頁面上聲明“此類的底層結構是一個哈希表”。 但是,C#哈希表不允許每個鍵有多個值,也不允許空鍵。

實現它作為Dictionary<string, List<object>似乎不是解決方案,因為get(string)將是O(1)但get(int)不是因為你必須遍歷所有鍵以找出哪個鍵具有如何其中有很多項目。

將它實現為兩個單獨的列表,其中一個是鍵的簡單List<string>List<Object>用於組合Dictionary<string, int>的值,它們指向每個鍵到第一個值的索引允許O(1)中的兩種類型的訪問,但不允許以有效的方式刪除,因為所有索引都必須在哈希表中更新(可能在O(n)中,但似乎不是最佳解決方案) 。 或者是否有更有效的方法來刪除條目?

如何實現這樣的數據結構?

NameObjectCollectionBase使用Hashtable和Arraylist來管理條目。 看看你自己!

Microsoft提供.NET庫的參考源代碼,可以集成到Visual Studio中:

http://referencesource.microsoft.com/

您甚至可以調試.NET庫:

http://msdn.microsoft.com/en-us/library/cc667410(VS.90).aspx

或者你可以獲得dotPeek的副本,這是一個免費的反編譯器:

http://www.jetbrains.com/decompiler/

暫無
暫無

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

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