为啥计数排序的时间和空间复杂度是 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))?的主要内容,如果未能解决你的问题,请参考以下文章