c++ - 如何从文件中读取哈夫曼树频率

标签 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 的计数。我的意思是我想创建某种动态系统,用户可以在其中输入任何字母来计算频率。

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

最佳答案

如果您根据每个字母表的整数值将其映射到维护其计数的表中,这很简单。

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

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

}

这里因为只有 256 个可能的字符,所以没有内存开销,然后您可以轻松提取输入中存在的字符,因为它们的 freq > 0

关于c++ - 如何从文件中读取哈夫曼树频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785043/

相关文章:

c++ - 我很难打印换行符

algorithm - 统计A到B的移动次数

java - 如何将大的 HashMap<String, Integer> 分成小的

python - 在Python中表示稀疏矩阵而不使用库

c - 将 .csv 文件读入 C LinkedList

c++ - 具有重载 ostream<< 运算符的递归类模板

c++ - 如何在 Linux 中跟踪 pthread 调度?

c++ - 为什么包含 "boost/multiprecision/cpp_int.hpp"会破坏套接字?

algorithm - 如何将 float 转换为人类可读的分数?

Mysql实现及多字段查询效率