铲斗分类的复杂程度如何才是O(n + k)?

时间:2011-11-07 17:26:31

标签: algorithm sorting

在说“之前已经提出此问题”或“找到算法书”之前,请继续阅读并告诉我,我的推理出现了哪些部分?

假设您有n个实体,并且将它们分成k个分区,这将花费O(n)时间。但是,需要对每个k bin进行排序,如果对每个bin使用快速排序这是一个O((n / k) log(n / k))操作,那么这一步将需要O(n < / em>的日志(N / K)+ K)。最后需要组装这个数组,这需要O(n + k),(见this post),所以总操作将是O(n + n log(n / k)+ k)。现在,这个n 日志(n / k)是如何消失的,我完全无法想象。我的猜测是有一些数学可以消除这个n * log(n / k)。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

你的假设:

  • k - 桶的数量 - 是任意的

错了。

铲斗排序有两种变体,因此非常混乱。


<强> A

桶的数量等于输入中的项目数

参见分析here


<强>乙

桶的数量等于 R - 输入整数的可能值的数量

请参阅分析herehere

答案 1 :(得分:0)

您的缺陷是假设快速排序用于对铲斗进行分类。通常情况并非如此,这就是您避免使用(n / k) log(n / k)条款的方式。

答案 2 :(得分:0)

您的分析看起来不错。术语Bucketsort用于许多不同的算法,因此根据您查看的算法,其平均运行时间可能为O(n + k)。

如果我不得不猜测,你可能已经看过一个典型的变体,其中一个选择k非常大,因此n / k将是一个常数。在另一种流行的变体中甚至是k>&gt; n,所以一个分为k / n桶。

如果你详细提供算法,并声称这个算法的平均值为O(n + k),我可以重温我的答案。