繁体   English   中英

保存霍夫曼代码的问题?

[英]problem in saving Huffman Code?

我想将霍夫曼代码保存到文件中。 我怎样才能做到这一点? 我将霍夫曼代码保存到字符串中,但生成文件的大小大于原始文件。

一个非常简单的方法是一次写一个,如下所示:

unsigned char acc; // Accumulator of bit waiting to be written
int bitcount;      // How many bits are aready present in the accumulator

// write a single bit (0/1)
void writebit(int bit)
{
    acc |= (bit << bitcount);
    if (++bitcount == 8)
    {
        writebyte(acc);
        acc = 0;
        bitcount = 0;
    }
}

读回一个位,该过程是对称的

unsigned char acc;   // bits waiting to be extracted
int bitcount;        // how many bits are still available in acc

int readbit()
{
   if (bitcount == 0)
   {
       bitcount = 8;
       acc = readbyte();
   }
   --bitcount;
   return (acc >> (7 - bitcount)) & 1;
}

当然,这只是最简单的方法,但我会在担心代码速度之前等待,直到您首先能够正确保存和加载编码数据。

例子:

假设您有以下霍夫曼编码符号

A - 0
B - 10
C - 110
D - 111

并且您要对序列进行编码

A B A A C D A D B B

然后你会按顺序打电话

writebit(0);                           // A
writebit(1); writebit(0);              // B
writebit(0);                           // A
writebit(0);                           // A
writebit(1); writebit(1); writebit(0); // C
writebit(1); writebit(1); writebit(1); // D
writebit(0);                           // A
writebit(1); writebit(0);              // B
writebit(1); writebit(0);              // B

因此,实际写入的字节数为

(01100010) = 0x62
(01010111) = 0x57

(请注意,显示的代码从最低有效位开始,即如果要识别符号,则应从右到左读取括号内的位序列)。

存储霍夫曼树的有效方法的答案应该对您有所帮助。

我相信您要保存的是一串 1 和 0。 真正的霍夫曼代码需要以二进制形式保存,然后再进行解析。 如果您只是将 output 保存为字符串,那么您将违背霍夫曼代码的目的,每个 0 和 1 都是 8 位而不是 1。

您可能正在为每个模式/字母保存整个字节。

假设 e 是最常见的字母。 它将有一个位模式 0。

假设 z 是最不常见的字母,它将具有以 1 开头的某种模式。让我们将其分配为 1111 111。

你要写的文件是这样的:

0111 1111

你可能正在写这个:

0000 0000 0111 1111。

您需要利用按位运算来执行此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM