c - 为什么频率阵列保存垃圾值?

标签 c arrays

所以有三个数组:- UserArray、UniqueArray 和 FrequencyArray。 ArraySize 是 UserArray 的大小。

#include<stdio.h>
int main()
{
      int ArraySize;
      scanf("%d",&ArraySize);
      int UserArray[ArraySize],UniqueArray[ArraySize],FrequencyArray[ArraySize];
      for(int i=0;i<ArraySize;i++)
      {
           scanf("%d",&UserArray[i]);
      }
      int SizeOfUniqueArray=0;
      for(int i=0;i<ArraySize;i++)
      {
              int j;
              for(j=0;j<i;j++)
              {
                      if(UserArray[i]==UserArray[j])
                      {
                              break;
                      }
              }
              if(j==i)
              {
                      UniqueArray[SizeOfUniqueArray]=UserArray[i];
                      SizeOfUniqueArray++;
              }
      }
      int count=0,k=0; 
      for(int i=0;i<ArraySize;i++) {
             if(UserArray[i]==UniqueArray[k])
             {
                     count++;
                     if(i == ArraySize-1)
                     {
                            FrequencyArray[k]=count;
                            count=0;
                            k++;
                            if(k <= ArraySize)
                            {
                                   i=0;
                            }
                     }
              }
       }
}

UserArray 是一个用户定义的数组,它存储整数,比如 1,2,3,4,8,4,3,1,5,6,7,1,2,6,2。 所以 ArraySize = 15。 UniqueArray 包含 UserArray 的唯一编号,意思是:- 1,2,3,4,5,6,7,8。 现在下面给出的代码是在 UserArray 中保存唯一数字频率的代码。 就像 UniqueArray 的第一个元素是 1。1 在 UserArray 中重复了 3 次,所以 FrequencyArray 的第一个元素是 3。但是这段代码在 FrequencyArray 中保存了垃圾值。 我想知道为什么? 为什么上面的程序会保存垃圾值?

我们可以通过这段代码将值保存在FrequencyArray中:-

for(int i=0;i<SizeOfUniqueArray;i++)
{
        int count=0;
        for(int j=0;j<ArraySize;j++)
        {
                if(UserArray[j]==UniqueArray[i])
                {
                        count++;
                }
        }
        FrequencyArray[i]=count;
}

最佳答案

我不确定您使用的算法是否可以获取 UniqueArray。在这里,我建议了一种替代算法。

下面的代码基于输入数字在 0 <= UserArray[i] <= MAXINT 范围内的假设.还有 MAXINT不应该很大或需要太多内存。

#define MAXINT  100           // The maximum unsigned integer that is supported.  
int FrequencyArray[MAXINT+1]; 

int main(void)
{
    int ArraySize;
    scanf("%d",&ArraySize);
    int UserArray[ArraySize];
    int UniqueArray[ArraySize];
    for(int i=0;i<ArraySize;i++)
    {
         scanf("%d",&UserArray[i]);
    }

    for(int i=0;i<ArraySize;i++) {
        FrequencyArray[UserArray[i]]++;
    }

    int k=0;
    for (int i=0; i<=MAXINT; i++)
    {
        if (FrequencyArray[i]!=0)
        {
            UniqueArray[k++] = i;
        }
    }
    int UniqueArraySize = k;    // for further use or printing.
}

如果你需要支持负数元素,那么FrequencyArray的转变是必需的。

如果MAXINT变得非常大则此算法不适合,建议使用其他哈希算法。

关于c - 为什么频率阵列保存垃圾值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57985807/

相关文章:

在C中组合字符串

c++ - C 和 C++ 差异行为

c++ - Visual C++ 2010 - 转换 10 GB BYTE 数组的最快方法?

Javascript将多行字符串拆分为对象

java - 将 int 转换为数组而不将其转换为 String

java - 如何在 Swift 中实现 java Arraycopy?

c - 在 ANSI C 中,const 值是全局的?

c - 无法将 C 结构传递给函数

通过将静态构建转换为特定于操作系统的二进制文件来跨操作系统构建

javascript - 如何在javascript中添加数组对象值