【发布时间】:2013-07-21 18:31:17
【问题描述】:
我有一个 16 个字母的字母表。给定一个句子,我想计算每个字母的频率,然后使用巧妙的位移将所有频率封装在一个数字中。让我们假设这些句子每个总是 100 个字母,并且假设没有字母出现超过 31 次,我想要这样的东西:
A: occurs 2 times -> 0010
B: occurs 10 times -> 1010
C: occurs 7 times -> 0111
等等。
现在,我想将这样的连接起来: 001010100111...
我只是集中了上面的频率。为了方便存储数字,我想将上面的二进制转换为 64 位无符号整数。
我的另一个要求是有那么长并重新提取每个字母的频率。因此,我需要能够生成小数,然后将其解析为各个频率位。
我将如何在 c 中做到这一点?我可以对这些频率进行位移和添加,但这意味着我正在重叠频率。另一个问题是在提取频率时,我怎么知道要移动多少位,因为尾随的 0 是微不足道的并且没有保存在十进制中,但它们在我的算法中非常重要。
有什么聪明的主意吗?谢谢你。
【问题讨论】:
-
最多 31 意味着存储一个字母的计数需要 5 位,乘以 16 个字母意味着 80 位 - 你有问题。可以将每个字母的限制设为 15 吗?还是只有 12 个字母?
-
您的规范最多只允许出现 15 个字母表中的单个字母。
-
抱歉,我的意思是最多 15 个。
-
一个解决方案可以通过使用汉明码适应 64 位整数来满足您最初的 16 个字母、31 个最大用法、100 个长句子的要求。这不是您建议的串联,但可行。