如何在霍夫曼编码中处理这个问题?

时间:2016-03-22 04:57:40

标签: c data-structures

带有频率的压缩字符的输入是

<script>
$(document).ready(function() {
$('#create').submit(function() { // catch the form's submit event
    $.ajax({ // create an AJAX call...
        data: $(this).serialize(), // get the form data
        type: $(this).attr('method'), // GET or POST
        url: $(this).attr('action'), // the file to call
        success: function(response) { // on success..
            $('#created').html(response); // update the DIV
        }
    });
    return false; // cancel original event to prevent form submitting
});
});
</script>

霍夫曼编码算法是,

首先,我们必须选择两个最低频率的字符并实现一个树,其中父节点是这两个字符频率的总和。   之后比0给左边的孩子和1对右边的孩子。   然后最后选择每个字符的值作为二进制形式,选择这个开始形式的根并找到它放在左边或右边,之后如果它被放在左边添加0,如果它是正确的添加1。

它形成了一个超过8级的树。我们不得不提到8位的二进制文件。但是对于这个输入,该位穿过8。 在这里我们要做什么?

1 个答案:

答案 0 :(得分:1)

如果您对所有256个可能的值进行编码,则某些值将由超过8位表示,这是正确的。但是你的编码字符串不能解释为数组ob字节,而是作为一系列位,可能占用多个字节,因此可以让你的霍夫曼树的分支比8级更深。< / p>

假设你有一个包含这些编码的霍夫曼树(其中包括):

E          000               # 3 bits
X          0100000001        # 10 bits
NUL        001               #3 bits

现在,当您想要对字符串EEXEEEX进行编码时,您会得到:

E   E   X          E   E   E   X          NUL      # original text
000 000 0100000001 000 000 000 0100000001 001      # encoded bits

现在,您将这一系列位组织成8个块,即字节:

eeeEEExx    xxxxxxxx    EEEeeeEE    Exxxxxxx    xxxNNN      # orig

00000001    00000001    00000000    00100000    00100100    # bits
enc[0]      enc[1]      enc[2]      enc[3]      enc[4]      # bytes

(四个子块只是为了方便阅读。最后两个零位是填充。)字节数组enc现在是你的编码字符串。

压缩来自于经常使用的字符占用少于一个字节的事实。例如,前两个Es适合单个字节。像X这样的不常见的字符有更长的编码,甚至可能跨越几个字节。

当然,您必须从当前字节中提取当前位以遍历您的霍夫曼树。你需要按位运算符。