我必须创建一个霍夫曼树,其字母(符号,我的意思是“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的计数。我的意思是我想创建一些动态类型的系统,用户可以输入任何字母来计算频率。
有可能做到这一点吗?
有什么帮助吗?
答案 0 :(得分:3)
如果您根据其整数值将每个字母映射到保持其计数的表,那么它很简单。
int freq[256];
char c;
while((c=fgetc(fp))!=EOF) {
freq[(unsigned int)c]++;;
}
这里只有256 possible characters
因此没有内存开销,然后您可以轻松地提取输入中的字符,因为它们将具有freq > 0