我必须创建一个霍夫曼树,其字母表(符号,我的意思是“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/