为啥计数排序的时间和空间复杂度是 O(n + k) 而不是 O(max(n, k))?

Posted

技术标签:

【中文标题】为啥计数排序的时间和空间复杂度是 O(n + k) 而不是 O(max(n, k))?【英文标题】:Why time and space complexity of counting sort is O(n + k) and not O(max(n, k))?为什么计数排序的时间和空间复杂度是 O(n + k) 而不是 O(max(n, k))? 【发布时间】:2018-10-11 18:15:21 【问题描述】:

这里,'n'和'k'分别是输入数组的大小和数组的最大元素。

由于在大小为“n”的数组中存在一个用于计算元素频率的运行,并且在大小为“k”的数组中以及对于数组中的每次遍历(或迭代)都有单独的运行,因此是 count[i] 次迭代,其中 'count' 是大小为 'k' 的数组。

与空间复杂度相同。

我正在寻找一个很好的解释来解释这个概念的每一点,你可以猜到我非常困惑。

【问题讨论】:

大 O 代表最坏的情况。循环运行大约 (n+k) 次,大于 max(n,k)。 【参考方案1】:

请注意O(n+k) = O(max(n, k)),因为

       max(n,k) <= n+k <= 2max(n,k)

而 big-O 看不到常量 2

【讨论】:

【参考方案2】:

感谢所有回复的人。但是,我想我明白了。

假设:

大小为N 的实际数组为A[] 数组A[] 中的最大元素是K 大小为K的元素计数频率数组为count[] 用于存储大小为N 的已排序元素的辅助数组为sorted[]

我是这样看的,A[] 中有一次运行用于获取最大元素,还有一次运行用于存储每个元素的频率。 这需要O(N)

现在,count[] 中有一次运行,并且对于每次迭代,都有一个循环 count[i] 次,用于在sorted[] 中按排序顺序插入数组元素。 count[] 中所有元素的总和不能大于N。所以这些操作的总时间是O(N + K)

因此,最坏情况下的时间复杂度为O(N + K)。如果我在某个地方错了,请纠正我。

【讨论】:

【参考方案3】:

其实在数组k上运行了两次

k 表示数组的大小。 O 符号中的“k”实际上表示最大元素。

如果我们写成 O(max(n,k)) 它将隐藏算法的细节,这高度依赖于最大元素

【讨论】:

以上是关于为啥计数排序的时间和空间复杂度是 O(n + k) 而不是 O(max(n, k))?的主要内容,如果未能解决你的问题,请参考以下文章

计数排序

排序 | 计数排序

计数排序

计数排序法

算法 计数排序

排序算法之计数排序