C 确定每个元素在数组中出现的频率?
是否有一种高效的C算法来计算和报告数组中相等元素的数量 例如,如果我们有C 确定每个元素在数组中出现的频率?,c,arrays,algorithm,C,Arrays,Algorithm,是否有一种高效的C算法来计算和报告数组中相等元素的数量 例如,如果我们有 int Z[] = { 4, 9, 4, 10, 4, 2, 10, 1, 19, 21, 21 }; 那么结果应该是 elem number 4 3 9 1 10 2 2 1 1 1 19 1 21 2 有很多方法可以做到这一
int Z[] = { 4, 9, 4, 10, 4, 2, 10, 1, 19, 21, 21 };
那么结果应该是
elem number
4 3
9 1
10 2
2 1
1 1
19 1
21 2
有很多方法可以做到这一点,每种方法都有不同的性能权衡 首先,您可以在数组上执行双for循环,并计算每个元素出现的次数。这需要时间O(n2),其中n是数组元素的数量。但是,它只需要空间O(1) 其次,可以将数组按升序排序,将相同的元素组合在一起。从这里,很容易看到每个元素出现的次数,因为您可以在数组中迭代一次,并计算每个元素连续出现的次数。运行时和使用的空间取决于数组的排序方式。如果使用heapsort,则运行时将为O(n log n),空间使用量将仅为O(1)。如果您碰巧知道数组中从0到U(包括0到U)的所有元素,则可以使用时间O(n+U)和空间O(U)中的计数排序或时间O(n log U)和空间O(n)中的基数排序 第三,您可以构建一个辅助表来存储每个元素的频率,并通过在数组中迭代一次来填充它,同时填充条目。如果使用哈希表,预期的运行时间将是O(n),空间使用量也将是O(n)。如果您知道数组元素在0到U(包括0到U)的范围内,您可以使用频率数组,并在时间O(n+U)和空间O(U)中求解此问题(本质上,这就是计数排序!) 这里没有明确的赢家。对于使用O(1)空间的对象,Heapsort具有最佳的时间复杂度。哈希具有最佳的总体时间复杂度,但空间利用率较差。根据数字的大小,计数或基数排序可能是最好的
根据您的情况,看看您的实际参数是什么,希望您能选择目前最适合您的解决方案。以下是一个有效的答案 第一个循环将countofnumbers数组初始化为全零 第二个循环扫描所有的数字,直到它达到零,然后扫描停止。这种方法的好处是,你可以添加一组中间不为零的数字,使你的数组变大,程序仍然可以运行 最后,第三个循环只需遍历countofnumbers数组,并以良好排序的方式打印结果 在预定义的数字数组中,不要删除零并重新运行程序,否则将得到意外的结果,其中可能包括分段错误
#include <stdlib.h>
#include <stdio.h>
int main(){
int Z[] = { 4, 9, 4, 10, 4, 2, 10, 1, 19, 21, 21, 0};
int n;
int lowest=1;
int highest=100;
int counts[highest+1];
for (n=0;n<=highest;n++){
counts[n]=0;
}
int *num=Z;
while((int)*num != 0){
counts[*num]++;
num++;
}
for (n=lowest;n<=highest;n++){
if (counts[n] > 0){
printf("%d = %d\n",n,counts[n]);
}
}
return 0;
}
#包括
#包括
int main(){
intz[]={4,9,4,10,4,2,10,1,19,21,21,0};
int n;
int最低=1;
int最高=100;
整数计数[最高+1];
对于(n=0;nYes,我想。我不同意你的观点,这是个愚蠢的问题。比如说“荷兰国旗问题”,你在哪里看到我说这是个愚蠢的问题?你的国旗问题与此有什么关系?你的声明非常讽刺。国旗问题是解决问题的一种非常有效的方法,我想知道有没有有效的算法来解决我的问题。Simply我会尝试从另一种方式来解决它。你基本上会问如何以有效的方式解决一个简单的问题。看看你的问题:关于什么有效?你的算法是什么?你觉得不够有效?为什么不有效?如果我问你:我有两个数字a
和b
。数学家们有没有想出有效的算法来解决这个问题?你的答案是什么?如果整数的可能范围很小(例如不超过100000),那么有一个非常简单的解