【问题标题】: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)。

标签: time-complexity space-complexity radix-sort counting-sort


【解决方案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)) 它将隐藏算法的细节,这高度依赖于最大元素

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-11
        • 2017-11-12
        • 1970-01-01
        • 2021-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-25
        相关资源
        最近更新 更多