带有频率的压缩字符的输入是
<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。 在这里我们要做什么?
答案 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这样的不常见的字符有更长的编码,甚至可能跨越几个字节。
当然,您必须从当前字节中提取当前位以遍历您的霍夫曼树。你需要按位运算符。