Algorithm 计数排序的运行时间
我试图理解计数排序的运行时间。在我的笔记中,它说,假设数组A的大小是n,k是每个数字出现的次数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]]++;
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。@gsingh2011k
不是数组中的最大值,它是数组中唯一值的数目array@KhaledAKhunaifer在您发布的链接中:“计数排序的输入由n个项组成,每个项都有一个非负整数键,其最大值最多为k”。这表示k
定义了上限,或者最大值是k
。在计数排序中,您不知道有多少唯一元素。对于[1,2100]
您将使用大小为100(最大值)的输出数组,而不是3(唯一值的数量)的输出数组@ GSIHH2011是正确的,但也注意到<代码> K <代码>不应该出现在时间复杂度中,除非我们考虑空间管理。因为我们在处理数组,而不是整个频率列表,循环仅是完整算法的1部分,不完全分析。问题完全是关于代码的这部分,其他PAR。ts是明显的。@aram90.次[1]+次[2]+…+次[k]的总和是多少?因为“次”数组包含每个元素的计数。请澄清。@chandresh它的总和不是1,而是n。