在获取或设置列表时,您应该对列表进行排序吗?

时间:2011-03-22 11:34:04

标签: performance list sorting

我经常遇到的一个决定是何时对项目列表进行排序。添加项目时,始终对列表进行排序,或者访问列表时。

是否有提高性能的最佳做法,或者只是说:如果主要访问列表,则在更改时对其进行排序,反之亦然。

3 个答案:

答案 0 :(得分:1)

答案很大程度上取决于。您应该分析并应用最适合您案例的策略。

如果你想要访问/查找元素的性能,一个好的决定是使用InsertionSort维护列表(http://en.wikipedia.org/wiki/Insertion_sort)。

访问时的排序列表可能仅适用于某些非常特殊的场景,多次插入,低访问和性能不是很重要。

但是,还有许多其他选项:比如维护一个说“list is sorted”的var,并在每次第n次插入,空闲或访问时排序(如果需要)。

答案 1 :(得分:1)

我习惯这样思考:

  • 如果列表一次性填充并且仅在读取之后,则以非排序顺序添加元素并在填充结束时对其进行排序(在复杂性方面,它需要O(n log n)加上复杂性填充,这通常比添加元素时的排序更快)
  • 相反,如果列表需要在完全填充之前读取,那么您必须按排序顺序添加元素(可能使用一些特殊的数据结构为您完成工作,如sortedlist,red-black tree等)

答案 2 :(得分:1)

在每个访问点对列表进行排序是一个坏主意。您必须拥有一个在修改集合时设置的标志。只有设置了此标志,您才需要排序然后重置标志。

但最好的情况是,如果您的数据结构按定义始终排序。这意味着,如果插入一个新元素,该元素将自动插入到右侧索引中,从而保持对该集合的排序。

我不知道您使用的是哪个平台/框架。我知道.NET提供了一个SortedList类,它可以为你管理那种插入排序算法。