如何从文件中读取霍夫曼树的频率

时间:2014-02-14 16:52:01

标签: c++ algorithm data-structures huffman-code

我必须创建一个霍夫曼树,其字母(符号,我的意思是“aaabbacaccba”等)必须作为唯一参数的Input.txt文件给出。

然后,我必须创建与每个字母对应的频率。 我在创建频率方面遇到了问题。 我想要这样的东西:假设我必须在input.txt中阅读这个:"aabcccadde"。然后我的代码必须打印出来:

sym:a, freq:3
sym:b, freq:1
sym:c, freq:3
sym:d, freq:2
sym:e, freq:1

我的代码工作正常:见下文:

   while (c != EOF && c != '\n' && c != '\r') 
   {
    Object1.data[count].symbol = c;
    if(Object1.data[count].symbol =='a')
    {
      save_a++;
    }
    if(Object1.data[count].symbol =='b')
    {
      save_b++;
    }
    if(Object1.data[count].symbol =='c')
    {
      save_c++;
    }
    if(Object1.data[count].symbol =='d')
    {
      save_d++;
    }
    if(Object1.data[count].symbol =='e')
    {
      save_e++;
    }
    count++;
    c = fgetc(input_file);
   }
    cout<< "save_a : "<<save_a <<endl<< "save_b : "<<save_b <<endl<< "save_c: "<<save_c<<endl<< "save_d : "<<save_d <<endl<< "save_e: "<<save_e<<endl;

所以输出是:

save_a : 5
save_b : 3
save_c: 2
save_d : 2
save_e: 3  

但问题是当用户再次将频率更改为“pqabbaddqpc”时。用户在这里添加了两个字母表,其中我只有计数器来读取a,b,c,d和e的计数。我的意思是我想创建一些动态类型的系统,用户可以输入任何字母来计算频率。

有可能做到这一点吗?
有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

如果您根据其整数值将每个字母映射到保持其计数的表,那么它很简单。

int freq[256];
char c;
while((c=fgetc(fp))!=EOF) {

  freq[(unsigned int)c]++;;

}

这里只有256 possible characters因此没有内存开销,然后您可以轻松地提取输入中的字符,因为它们将具有freq > 0