Algorithm 计数排序的运行时间

Algorithm 计数排序的运行时间,algorithm,big-o,asymptotic-complexity,Algorithm,Big O,Asymptotic Complexity,我试图理解计数排序的运行时间。在我的笔记中,它说,假设数组A的大小是n,k是每个数字出现的次数 Counting-Sort(A,k) { for (i=1; i <= k; i++) // initialize number counters to 0 times[i] = 0; for (j=1; j <= length[A]; j++) // decide how many times each times[A[j]]++;

我试图理解计数排序的运行时间。在我的笔记中,它说,假设数组A的大小是n,k是每个数字出现的次数

 Counting-Sort(A,k) {
   for (i=1; i <= k; i++) // initialize number counters to 0
       times[i] = 0;

   for (j=1; j <= length[A]; j++) // decide how many times each
       times[A[j]]++;                  // number appears in the input

  // form the sorted array
  m=1;
    for ( i=1; i <= k; i++)    // consider each number in the range
         for ( j=1; j <= times[ i ]; j++) { // generate that number in 
            A[m]=i;                   // the output as many times as
            m++;                      // it occurs in the input
         }
  }
计数排序(A,k){

对于(i=1;i注释不完全正确。
k
是数组中显示的最大数字(即,它的数字从1到k)。因此,让我们逐步完成算法:

  • 初始化
    k
    “箱子”:
    O(k)
  • 计算每个数字出现的频率:
    O(n)
    • 所有存储箱中的值之和正好是
      n
      ,因为这就是数组中总共有多少个条目
  • 迭代存储箱:
    O(k)
    • 在结果数组中设置与bin表示的元素数量相同的元素:似乎
      O(n)
  • 这里重要的一点是,我们知道,即使我们迭代
    k
    bin,并且通常每个bin所代表的值可能多达
    n
    ,但我们设置了bin,以便在所有外循环迭代中,内循环仍然运行总共
    n
    次这个步骤实际上是
    O(n)

    如果我们忽略了关于垃圾箱内容的额外知识,你绝对是对的

    现在还有最后一个转折点:如果
    k>n
    ,它实际上在
    O(k)
    而不是
    O(n)
    !因为现在外循环是“运行更频繁”的东西


    我希望这有点道理。

    正如您在循环中看到的那样

    m=1;
    for ( i=1; i <= k; i++)    // consider each number in the range
         for ( j=1; j <= times[ i ]; j++) { // generate that number in 
            A[m]=i;                   // the output as many times as
            m++;                      // it occurs in the input
         }
    
    m=1;
    
    对于(i=1;i算法

    计数排序,也称为直方图排序

    n = length of input Array
    
    k = number of unique symbols that appear in the input Array
    
    • 初始化需要
      k
      时间

    • 计数需要
      n
      时间

    • 枚举需要
      Sum{Count(i)}=n
      时间

    复杂性

    Time = k + n + n = 2n+k
    
    Time ~ O(2n+k) = O(n+k)
    
    Space = n + k ~ O(n+k)
    

    创建一个小的示例数组并手动或用程序填充
    ,应该清楚的是,最内部的循环总共最多执行
    n次
    ,而不是
    nk次。它实际上需要2n+k次,O(n+k)检查:k不能大于n,k是数组的大小,它在输入数组A中存储唯一值的直方图,其中n是输入数组A的大小。检查:@ KhaledAKhunaifer <代码> k>代码>绝对可以大于<代码> n< /代码>。考虑数组<代码>(1, 2, 100)
    n
    是3,但
    k
    是100。@gsingh2011
    k
    不是数组中的最大值,它是数组中唯一值的数目array@KhaledAKhunaifer在您发布的链接中:“计数排序的输入由n个项组成,每个项都有一个非负整数键,其最大值最多为k”。这表示
    k
    定义了上限,或者最大值是
    k
    。在计数排序中,您不知道有多少唯一元素。对于
    [1,2100]
    您将使用大小为100(最大值)的输出数组,而不是3(唯一值的数量)的输出数组@ GSIHH2011是正确的,但也注意到<代码> K <代码>不应该出现在时间复杂度中,除非我们考虑空间管理。因为我们在处理数组,而不是整个频率列表,循环仅是完整算法的1部分,不完全分析。问题完全是关于代码的这部分,其他PAR。ts是明显的。@aram90.次[1]+次[2]+…+次[k]的总和是多少?因为“次”数组包含每个元素的计数。请澄清。@chandresh它的总和不是1,而是n。