簡體   English   中英

SortedList與SortedDictionary vs. Sort()

[英]SortedList vs. SortedDictionary vs. Sort()

這是像這樣的問題的延續。

是否有任何調整性能的指導原則? 我並不是指大O的收益,只是節省一些線性時間。

例如,預排序可以在SortedListSortedDictionary上保存多少?

假設我有一個有3個屬性的人類排序,其中一個是年齡。 我應該先按年齡換取物品嗎?

我應該首先對一個屬性進行排序,然后使用結果列表/字典對兩個屬性進行排序,依此類推?

想到的任何其他優化?

好吧,它在SortedList上輕松獲勝。 插入項目需要二進制搜索(O(log(n))來查找插入點,然后使用List.Insert(O(n))來插入項目.Insert()占主導地位,填充列表需要O(n ^ 2)。如果輸入項已經排序,那么Insert會折疊到O(1)但不會影響搜索。填充現在是O(nlog(n))。你不用擔心哦有多大,首先排序總是更有效率。假設您可以承受雙倍的存儲需求。

SortedDictionary是不同的,它使用紅黑樹。 查找插入點需要O(log(n))。 之后可能需要重新平衡樹,這也需要O(log(n))。 因此填充字典需要O(nlog(n))。 使用排序輸入不會改變查找插入點或重新平衡的工作量,它仍然是O(nlog(n))。 現在,哦很重要,插入已排序的輸入需要樹本身不斷重新平衡。 如果輸入是隨機的,你不需要排序輸入它會更好。

因此,使用排序輸入填充SortedList並使用未排序的輸入填充SortedDictionary是O(nlog(n))。 忽略提供排序輸入的成本,SortedList的Oh小於SortedDictionary的Oh。 由於List分配內存的方式,這是一個實現細節。 它只需要執行O(log(n))次,紅黑樹必須分配O(n)次。 很小哦順便一下。

值得注意的是,沒有人比簡單地填充List,然后調用Sort()更有利。 這也是O(nlog(n))。 實際上,如果輸入已被意外排序,則可以繞過Sort()調用,這會折疊為O(n)。 現在,成本分析需要轉移到輸入排序所需的工作量。 很難繞過Sort(),O(nlog(n))的基本復雜性。 它可能不容易看到,您可能會獲得按SQL查詢排序的輸入。 完成任務需要更長的時間。

使用SortedList或SortedDictonary的目的是在插入后對集合進行排序。 如果您只擔心填充但不變異,那么您不應該使用這些集合。

暫無
暫無

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

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