【问题标题】:How to speed up Quickselect with many duplicate elements?如何使用许多重复元素加速快速选择?
【发布时间】:2015-07-14 03:29:15
【问题描述】:

我目前正在实施Quickselect Algorithm 以获得列表中最好的 n 个元素。 在这种情况下,“最佳”元素是最大的。

我的问题如下:
我发现这在许多重复元素的情况下性能很差,因为最后未排序的值都是相同的,此时左边框在每次迭代时只会增加 1,而与枢轴索引无关.

有什么办法可以解决这个问题并在这种情况下中止吗?

【问题讨论】:

  • 另请注意,当您选择少于 1% 的项目时,使用堆的替代选择方法将比 QuickSelect 更快。有关详细信息,请参阅blog.mischel.com/2011/10/25/when-theory-meets-practice。例如,如果您要从数百万个列表中选择前 1000 个项目,则使用堆选择算法。
  • 做一个三向分区而不是二向分区 - 选择一个枢轴,然后分区成更小、等于和更大的元素。

标签: algorithm search partitioning


【解决方案1】:

快速选择基于快速排序算法。

根据Quicksort complexity when all the elements are same?,当所有元素都相等时,快速排序可以达到最坏情况的时间复杂度。

该链接还提供了一个解决方案 [1] 如何加快快速排序。由于 Quickselect 基于 Quicksort,因此类似的解决方案可能会对您有所帮助。


  • [1] 该解决方案提到了分区的想法。 CS.SE 有一些问题确实包含代码并比较了 Quicksort 的 2 种分区算法,即 Lomuto 建议的方法和 Hoare 建议的方法:CS.SE: Quicksort Partitioning Hoare vs Lomuto
    标记的答案还指出,Hoare 的变体更有效,而 Lomuto 的变体更容易正确实施。所以根据你的情况,后者可能就足够了。

  • [2] QuickSort and Hoare Partition

【讨论】:

  • 这似乎很有希望,但你链接到的答案对我来说太模糊了,无法以这种方式实现......
  • @Karsten 我添加了 2 个链接,指向处理此分区算法(以及 Hoarde 和 Lomuto 提出的不同变体)实现的问题,希望对您有所帮助!
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 2018-08-18
  • 2018-02-07
  • 1970-01-01
  • 2011-11-30
  • 2016-04-08
  • 2020-08-15
  • 2011-06-24
相关资源
最近更新 更多