什麼 .NET 字典支持“查找最近的鍵”操作?
我正在將一些 C++ 程式碼轉換為 C#,它呼叫 std::map::lower_bound(k) 在映射中查找其鍵等於或大於 k 的條目。但是,我看不到任何方法可以用 .NET 的 SortedDictionary 做同樣的事情。我懷疑我可以使用 SortedList 實現一種解決方法,但不幸的是,SortedList 太慢(插入和刪除鍵的 O(n))。我能做些什麼?
注意:我找到了一種利用我的特定場景的解決方法……具體來說,我的鍵是從 0 開始的密集整數,所以我使用 List<TValue> 作為我的字典,列表索引用作密鑰,並且搜尋等於或大於 k 的密鑰只需幾個循環迭代即可完成。但是很高興看到原始問題得到回答。
我開發了幾個支持“查找下一個較高鍵”和“查找下一個較低鍵”操作的集合類。
首先,我製作了一套Compact Patricia Trie系列。這些是旨在最小化記憶體使用的集合/字典;它們對於大量 URL 和某些其他類型的數據特別有效。它們只能部分解決問題,因為只支持某些類型的鍵,即
byte[],string和所有原始整數類型 (Int8..UInt64)。此外,字元串排序區分大小寫。NuGet 包:Loyc.Utilities發布這個答案後,我製作了更多排序的資料結構來解決這個問題:
BList<T>、BDictionary<K,V>和. 有關詳細資訊,請參閱我的第二個答案。BMultiMap<K,V>``SparseAList<T>
問題是字典/雜湊表旨在根據輸入值到達唯一的記憶體位置,因此您需要一個資料結構,旨在容納與您儲存的每個值相關的範圍,同時時間正確更新每個間隔
我認為跳過列表(或平衡二叉樹)可以幫助你。儘管它們不能在 O(n) 中執行查找,但它們可以以對數方式執行,並且仍然比樹快。
我知道這不是一個正確的答案,因為我不能說 .NET BCL 已經包含這樣一個類,不幸的是你必須自己實現一個,或者找到一個支持它的第 3 方程序集。不過,這裡的 CodeProject似乎有一個很好的例子。