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 有很多方法可以做到这一

是否有一种高效的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

有很多方法可以做到这一点,每种方法都有不同的性能权衡

首先,您可以在数组上执行双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),那么有一个非常简单的解