繁体   English   中英

将在LinkedList上进行二进制搜索 <T> 将值插入排序后的值列表中间可以提高性能?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM