[英]Will a binary search on LinkedList<T> to insert a value into the middle of a sorted value list increase performance?
我需要創建一個排序列表,一次添加一個項目。 所以我決定使用LinkedList<T>
,因為它在插入操作中很有效。 但是當找到合適的位置時,它似乎需要更長的時間。 我正在使用線性搜索來獲取位置。 如果我使用ElementAt
方法使用二進制搜索來獲取正確的位置,是否會提高性能? 根據這個 ,它仍然是一個O(n)的操作。 你怎么看? 如果是這樣,還有其他更好的數據結構可用於這項工作嗎? 因為如果我使用不同的數據結構,則在向中間插入新值時,將不得不將該位置之后的所有數據移動一個位置,這顯然是不希望的。
您的問題有一些誤解。
在LinkedList上進行二進制搜索以將值插入到已排序的值列表中間是否會提高性能?
二進制搜索僅對排序的集合有意義。 LinkedList<T>
不是一個。 這是尊重收藏的插入順序。 要對LinkedList<T>
執行二進制搜索:
您將不得不對鏈表進行排序,這不僅效率很低(對鏈表進行操作),而且對於僅插入文件也需要太多工作
否則在插入時您將不得不通過將其插入正確的位置來維持排序順序,這又是一件繁重的工作。
從您的問題中我了解到,您想要一種尊重集合的排序順序,但是插入必須更快(這不同於典型的List<T>
O(n)特性)。 我的建議是在.NET中使用排序的集合類型。 在system.dll
沒有SortedSet<T>
。 這不會讓您有重復項,因為它是一個集合,在這種情況下,您可以實現自定義SortedBag<T>
(或SortedList<T>
或任何名稱),如下所示 。
我正在使用線性搜索來獲取位置。
我的建議是您不要那樣做。 讓集合本身找到執行插入的位置。 排序的收集類型最適合此處。
如果我使用
ElementAt
方法使用二進制搜索來獲取正確的位置,它將提高性能
ElementAt
方法不執行二進制搜索。 充其量它會檢查集合類型是否為IList<T>
並相應地使用索引器。 在您的情況下,這對性能沒有影響。
在中間插入一個新值時,我將不得不將該位置之后的所有數據移動一個位置,這顯然是不希望的。
沒錯,插入基於數組的結構(如List<T>
)的中間是O(n)操作。 我不確定您是否也需要索引操作,但這會更昂貴。 您可以具有帶有效插入的排序收集類型,而沒有索引的意義,或者可以具有帶索引的排序收集類型,但是插入將為O(n)。 這是您必須付出的代價。
為了您的目的,您最好使用SortedDictionary類(或也許SortedList)
SortedDictionary給出O(log n)的插入和檢索時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.