代写 Java 霍夫曼代码为字母表中的字符指定可变长度标识符。标识符的长度取决于字符出现的频率 – 字符出现的频率越高,标识符越小。标识符可以由树表示,树的叶子是字母表的字符。标识符现在由从根到叶的路径定义:如果我们接下来在路径中选择左子节点,此时标志符为0,如果旋转右子节点为1。
霍夫曼代码为字母表中的字符指定可变长度标识符。标识符的长度取决于字符出现的频率 – 字符出现的频率越高,标识符越小。标识符可以由树表示,树的叶子是字母表的字符。标识符现在由从根到叶的路径定义:如果我们接下来在路径中选择左子节点,此时标志符为0,如果旋转右子节点为1。 用于创建此类树的霍夫曼算法的工作原理如下:我们采用优先级队列(通过密钥在内部对项目进行排序的队列)并将字母表中的每个字符作为(未连接的)树节点插入,并将字符的频率作为优先级队列中的键。然后我们此时从优先级队列中删除两个最小的节点,创建一个新的节点,将两个删除节点作为子节点,并将这个新节点放回优先级队列中,并带有子节点的总和。在n-1次重复之后,优先级队列中只有一个元素 – 然后它代表树的根。 您现在应该使用霍夫曼代码来压缩数据。 在我们的例子中,字母表由一个字节可以假设的所有可能值组成(-128到127)。 在框架中实现以下几点: • 在HuffmanCodes类中实现buildFrequencyTable方法,该类存储frequencyTable列表中每个字节的数据的相对频率。 • 在HuffmanCodes类中实现buildHuffmanTree方法,如上所述,该方法构建Huffman树上字节的频率。 将此树的根保存在huffmanTreeRoot中。 对于优先级队列,您可以使用Java类PriorityQueue。 c) 在HuffmanCodes类中实现buildHuffmanTable方法,该方法为所有字节 构造一个标识符数组(我们也可以每次在树中搜索字节以获取标识符,但这会慢 很多)。结果应存储在codeTable中。 d) 在HuffmanCodes类中实现压缩和解压缩方法,该方法将给定的输入流压缩到输出流中。您可能需要使用codeTable和Huffman树。 e)在HuffmanCodes类中实现saveHuffmanTree和loadHuffmanTree方法,该方法将Huffman树存储在输出流中或者再次从输入流中读出它。在这样做时,您应该为自己考虑树的有效存储形式。但是,它不应超过400个字节。 (f)在DataCompressor类中实现压缩和解压缩方法。 压缩流应具有以下格式:首先是三个字节“AUD”,表示此数据已被我们的算法压缩。 接下来是霍夫曼树的表示。 随后,压缩字节数被存储为整数,最后是压缩数据。 首先应检查解压缩数据的前三个字符“AUD”,然后读取数据。 如果传递的数据中存在错误,则应抛出EncodingException。