Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何使用多个重复元素加速Quickselect?_Algorithm_Search_Partitioning - Fatal编程技术网

Algorithm 如何使用多个重复元素加速Quickselect?

Algorithm 如何使用多个重复元素加速Quickselect?,algorithm,search,partitioning,Algorithm,Search,Partitioning,我目前正在实现以获得列表中最好的n个元素。 在这种情况下,“最佳”元素是最大的 我的问题如下: 我发现,如果有许多重复的元素,那么性能会很差,因为最后没有排序的值都是相同的,在这一点上,无论轴索引如何,左边框在每次迭代中只会增加1 在这种情况下,有没有办法修复此问题并中止?Quickselect基于快速排序算法 根据,当所有元素相等时,快速排序可能会达到其最坏情况下的时间复杂度 该链接还提供了如何加速快速排序的解决方案[1]。由于Quickselect基于快速排序,类似的解决方案可能会对您有所帮

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

我的问题如下:
我发现,如果有许多重复的元素,那么性能会很差,因为最后没有排序的值都是相同的,在这一点上,无论轴索引如何,左边框在每次迭代中只会增加1


在这种情况下,有没有办法修复此问题并中止?

Quickselect基于快速排序算法

根据,当所有元素相等时,快速排序可能会达到其最坏情况下的时间复杂度

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


  • [1] 该解决方案提到了分区的思想。CS.SE有一些问题,包括代码,并比较了两种用于快速排序的分区算法,即Lomuto建议的方法和Hoare建议的方法:。
    有标记的答案还指出,霍尔的变体更有效,而洛穆托的变体更容易正确实现。因此,根据您的情况,后者可能就足够了

  • [2]


这似乎很有希望,但您链接到的答案太模糊,我无法以这种方式实现…@Karsten我添加了两个链接,指向有关此分区算法实现的问题(以及Padge和Lomuto提出的不同变体),希望对您有所帮助!还请注意,当您选择的项目少于1%时,使用堆的替代选择方法将比QuickSelect更快。有关详细信息,请参阅。例如,如果要从数百万个项目列表中选择前1000个项目,请使用堆选择算法。执行三向分区而不是双向分区-选择一个轴,并将其划分为更小、相等和更大的元素。