计算C中二维数组中字符串的频率

时间:2016-05-08 22:25:20

标签: c arrays multidimensional-array

我有点卡在一段代码上,我希望我能在这里获得一些见解。

基本上我正在读取输入文件,抓取位值并存储它们。在2D数组中。

我想要完成的是找到2D数组中每个字符串的出现次数。

例如,以下是存储在2d数组sortBuffer[][]

中的第一对条目中的内容
111000101
110000101
111110000
101011000
000000010
101001000

所以我需要完成的是创建一个计数数组,它会告诉我111000101中出现110000101sortBuffer的次数。

因为它是我正在使用的2D数组,所以我不确定如何比较整个字符串。任何有关这方面的帮助将不胜感激。提前谢谢大家。

作为一个额外的步骤,我需要按位值组织数组,从

开始
000000001
000000010
000000011
000000100  and so on...
int getBitVal(unsigned char *keyStrBin, int keyIndex) {

    int keyMod = keyIndex % 8;  
    int keyIn = keyIndex / 8;

    return (((keyStrBin[keyIn]) >> (7 - (keyMod))) & 1);
}

void test(FILE *inputFile) {
    int nRead;
    size_t fSize = size(inputFile);
    unsigned char *inBuffer = malloc(fSize * sizeof (unsigned char));
    memset(inBuffer, 0, fSize);

    nRead = fread(inBuffer, 1, fSize, inputFile);

    int h = 0;
    int b = 0;
    int m = 9
    int n = 24720
    char sortBuffer[m][n / m];

    for (i = 0; i < fSize * 8; i++) {
        sortBuffer[b][h] = getBitVal(inBuffer, i);
        b++;
        if (i % m == 0 && i != 0) {
            b = 0;
            h++;
        }  
    }

//This is where I need to count the number of times any given string occurs within the `sortBuffer` `char`.

1 个答案:

答案 0 :(得分:0)

以下是计算频率并对数据进行排序的示例,其中宽度为9且数据已在数组中,而不是从文件中读取:

#include <stdio.h>

int main()
{
  int height=6;
  int sortBuffer[6][9] = {
   {1,1,1,0,0,0,1,0,1},
   {1,1,0,0,0,0,1,0,1},
   {1,1,1,1,1,0,0,0,0},
   {1,0,1,0,1,1,0,0,0},
   {0,0,0,0,0,0,0,1,0},
   {1,0,1,0,0,1,0,0,0}
  };
  int freq[2<<9]={0};
  int print, count, index, row, column, value;
  // store the counts
  for(row=0;row<height;row++)
  {
    for(value=0,column=0;column<9;column++) value=value*2+sortBuffer[row][column];
    freq[value]++;
  }
  // print the numbers
  for(index=0;index<(2<<9);index++)
  {
    for(count=freq[index];count>0;count--)
    {
      for(print=9;print>0;print--) printf("%d", (index & (1<<(print-1))) >> (print-1) );
      puts("");
    }
  }
  return 0;
}

在第一个for循环中,我们计算所有位的十进制数。我们从值0开始,然后对于数字中的每个位,我们将值向左移一位并添加当前位。在循环结束时,所有位都已移入,并且我们有一个包含所有位的整数。我们使用它作为freqency数组的索引并在该索引处递增值 - 该值是该值存在的次数的计数。

在第二个for循环中,我们遍历频率数组,并且每个值打印出我们需要的数字的副本。由于我们从索引0开始,因此我们将按排序顺序自动打印它们。棘手的部分是从一个整数打印一位 - 基本上你需要掩盖你想要的位&amp;然后把它转移到那个地方。例如,要获得V的第四位,您需要(V & (1 << 3)) >> 3(V & (1 << (4-1))) >> (4-1)相同,在我们的情况下index是值,print是位。