繁体   English   中英

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

[英]How could the complexity of bucket sort is O(n+k)?

在说“之前已经被问过”或“找到算法书”之前,请继续阅读并告诉我,我的推理部分出了什么问题?

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

你的假设:

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

是错的。

存储桶排序有两种变体,因此非常混乱。


一种

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

这里的分析


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

请参见此处此处的分析

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

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

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

如果你提供详细的算法和声称这是平均O(n + k)的来源我可以重新审视我的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM