【问题标题】:What is k in counting sort O(n+k) time complexity?计数排序 O(n+k) 时间复杂度中的 k 是多少?
【发布时间】:2018-01-11 08:56:36
【问题描述】:

计算排序最差、最佳和平均时间复杂度为O(n+k),其中 n 是要排序的元素数。 k到底是什么? 我看到了不同的定义:最大元素、最大元素和最小元素之间的差异等等。

  1. 给定数组arr1 [1, 3, 5, 9, 12, 7 ]arr2 [1,2,3,2,1,2,4,1,3,2] arr1arr2k 是什么?
  2. 用计数排序对arr1进行排序真的很愚蠢吗,因为 n < k(元素值的范围大于 要排序的元素?

【问题讨论】:

  • 我认为没有“等等”。
  • 您的意思可能是“当n < k”而不是“因为n > k”。
  • 这取决于你如何编码。您可能想查看算法或查看时间复杂度的基础知识,因为这应该可以让您自己很容易地弄清楚这一点。这本质上是 How to find time complexity of an algorithm 的副本。

标签: algorithm sorting counting


【解决方案1】:

k 是数组中的最大可能值,假设您有一个长度为 5 的数组,其中每个数字都是 0 到 9 之间的整数,在本例中 k 等于 9

【讨论】:

  • 感谢分享知识!我的答案是否正确:对于 3 个元素的数组 [3, 20, 57] k = 57(“k 是数组中的最大可能值”)?对吗?
【解决方案2】:

k 是键的范围,即覆盖所有可能值所需的数组槽数。因此,如果是数字,Max-Min+1。当然,这假设您不浪费空间,将Min 分配到第一个插槽,将Max 分配到最后一个。

k不超过n的小倍数时使用计数排序是合适的,让n.k,在这种情况下,n.k可以击败n.log n

【讨论】:

  • 非常感谢!请问“覆盖所有可能值所需的数组槽数。因此,对于数字,Max-Min + 1”表示 3 个元素的数组 [3, 20, 57] k = 3(我们有 3 个可能的值,所以只有 3 个“数组槽”)还是 k = 55 (57 - 3 + 1)?附言我知道k >> n,所以我更喜欢基数排序,而不是使用计数排序......
  • @CodeComplete:你也可以拥有k < n
【解决方案3】:

首先将 k 个计数的数组清零。然后读取数组中的 n 个元素,根据 n 个元素的值递增 k 个计数的元素。在计数排序的输出过程中,读取包含 k 个计数的数组,并写入包含 n 个元素的数组。所以有 k 次写入(将计数归零),n 次读取,然后 k 次读取和 n 次写入,总共 2n + 2k 次操作,但大 O 忽略了常数 2,因此时间复杂度为 O(n + k)。

【讨论】:

  • 我说得对吗,如果我们说计算排序时间复杂度是 O(n+k),那么 n 是要排序的所有元素的数量,k 是 DISTINCT 元素的数量?例如对于数组 [ 3, 5, 7, 5, 1, 5] n = 6 和 k = 4 ?
  • @CodeComplete - 通常 k 是数字的范围,最大值 + 1 - 最小值。计数数组的大小为 k。对于 [3 5 7 5 1 5],k 将为 7(最大值 7 + 1 - 最小值 1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多