簡體   English   中英

如何在 O(1) 或 O(log n) 時間內獲取集合中鍵最小的元素?

[英]How do I get the element with the smallest key in a collection, in O(1) or O(log n) time?

我知道我可以使用Dictionary並在 O(1) 時間內檢索任意元素。

我知道我可以在 O(1) 時間內獲得SortedDictionary中的下一個最高(或最低)元素。 但是,如果我想刪除SortedDictionary中的第一個值(基於TKeyIComparable )怎么辦?

我可以使用.First()方法來檢索最小的鍵嗎? 它的復雜性是什么? 它會在 O(1)、O(log n) 或 O(n) 時間內運行嗎?

SortedDictionary是正確的數據結構嗎?

注意:用例有點像窮人的優先級隊列或有序隊列。 不允許開源(必須是從頭開始的代碼,或者已經在 .NET 3.5 框架中)。

SortedList 和 SortedDictionary 在內部實現為二叉搜索樹,理想情況下可以為您提供一個 Min 的 O(log n) 性能(需要遍歷樹,但不枚舉整個列表)。 但是,使用 LINQ 執行 Min 可能會枚舉整個列表。

我會考慮將跳過列表作為更好的替代數據結構。

SortedDictionary.GetEnumerator被聲明為具有 O(log n) 時間 - 所以 First() 應該效仿。

如果您有SortedDictionarySortedList ,則可以使用.First() (或dict.Keys[0]用於SortedList )否則,您可以這樣做:

dict[dict.Keys.Min()]

這將具有總體 O(N) 時間(因為 Min() 必須迭代整個集合)

.First()對於 SortedList 可能有 O(1) 時間,對於 SortedDictionary 可能有 O(log n) 時間。

對於 SortedDictionary,插入和刪除將是 O(log N) 時間,對於 SortedList 可能高達 O(N)。 請注意,如果您使用字典來支持“優先級隊列”,則不能有兩個具有相同優先級的項目。

我不認為 class 對 Last 有特殊的實現,所以如果你想要最高值的鍵,你可能應該使用 SortedList,因為你可以做dict.Keys[dict.Count-1] 如果您想要最高的(而不是最低的),您可以使用比較器按該順序對其進行排序並使用 First。

為什么不保留一個單獨的排序鍵列表,以便您始終可以通過執行dict[keyList[0]]獲得具有最小鍵的元素。

由於您只提到了獲取值而不是設置它們,您可以使用一個簡單的列表,提前對其進行排序,然后在 O(1) 中按順序訪問任何值。

對於未排序的集合,獲取最高或最低元素是 O(n),因為任何項目都可能是最高或最低的,因此您必須查看每個項目。 如果您想快速完成此操作(O(1)),您需要一個排序的數據結構,以便您可以根據值的位置推斷值的相對位置。

暫無
暫無

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

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