非并行样本排序是不是与快速排序具有相同的复杂性?

Posted

技术标签:

【中文标题】非并行样本排序是不是与快速排序具有相同的复杂性?【英文标题】:Does the non-parallel sample sort have the same complexity as quick sort?非并行样本排序是否与快速排序具有相同的复杂性? 【发布时间】:2015-07-30 16:44:11 【问题描述】:

根据wikipedia等资源,快速排序恰好是样本排序的一个特例,因为我们总是选择1个分区项,放在它的位置继续排序,所以快速排序就是样本排序,其中m(每个步骤的分区项目数)为 1。所以,我的问题是,对于 1

以下是***上描述的样本排序算法。

1) 通过对数据进行采样,找到拆分器,即将数据分解为桶的值。

2) 使用排序拆分器定义存储桶并将数据放入适当的存储桶中。

3) 对每个桶进行排序。

我不确定我是否正确理解了这个算法,但我认为我们首先找到分区项,将其放在它的位置,然后向左和向右查找以找到更多的分区项,然后递归调用将这些 m 个样本中的每一个再次划分为 m 个样本的相同函数,我是对的吗?因为如果是这样,似乎样本排序执行与快速排序相同,因为它只是做同样的事情,除了一半是迭代的(在寻找拆分器时),一半是递归的。

【问题讨论】:

【参考方案1】:

它们将具有不同的复杂性。当 m > 1 时,它们的运行将近似于 CNlogm+1N。常数 C 将大到足以使其比普通 QuickSort 慢,因为没有已知算法将列表划分为 m + 1 个桶,其效率与将列表划分为两个桶的效率一样。

例如,普通的快速排序将花费 O(N) 将列表划分为两个子数组。假设在最佳情况下,QuickSort 完美地选择了将列表拆分为两个相同大小的桶的值。

Cn = 2Cn/2 + n = nlog2n

假设 m = 2 这意味着我们需要将列表划分为三个子数组。假设在最好的情况下,我们可以完美地选择将列表分成三个相同大小的桶的值。但是,假设分区的成本是 O(3N)。

Cn = 3Cn/3 + 3n = 3nlog3n

如你所见

3nlog3n > nlog2n.

【讨论】:

但是我们如何分区呢?我在任何地方都没有看到正确描述的算法。为什么当 m = 2 时 C_n = 3C_n/3 + 3n?我想你的意思是 3C_n/3 + 2n?这样我们得到 2Nlog_3(N),但这并没有改变任何东西 @paulpaul1076,我假设为 m = 2 进行分区将花费大约 O(3N)。您可以通过小于第一个和第二个拆分器的第一个计数元素来实现 O(3N)。设分离器的位置为 P(0) 和 P(1)。小于这两个的计数值需要 O(N)。然后,将列表分成 3 个桶需要 O(2N),因为您需要将列表复制到临时列表中。然后,任何小于第一个值的东西都将放置在 P(0) 以下的位置,而任何小于第二个值的东西都将放在 P(1) 以下的位置。 @paulpaul1076,虽然,你可以想出需要 O(2N) 来划分为 3 个桶的算法,它需要 2Nlog_3(N) 大于 Nlog_2(N) 因为限制 2Nlog_3( N)/Nlog_2(N) 当 N 接近无穷时大于 1。

以上是关于非并行样本排序是不是与快速排序具有相同的复杂性?的主要内容,如果未能解决你的问题,请参考以下文章

漫画为什么说O(n)复杂度的基数排序没有快速排序快?

堆排序

快速排序 递归与非递归

算法与数据结构快速排序算法

快速排序到底有多快?(含代码分析9大排序算法并行运行对比视频)

快速排序:递归与非递归