-
应用实例

-
代码实现,转为赫夫曼树
| public class HuffmanCode { |
| |
| public static void main(String[] args) { |
| String content = "i like like like java do you like a java"; |
| byte[] contentBytes = content.getBytes(); |
| System.out.println(contentBytes.length); |
| |
| List<Node> nodes = getNodes(contentBytes); |
| System.out.println("nodes=" + nodes); |
| |
| |
| System.out.println("赫夫曼树"); |
| Node huffmanTreeRoot = createHuffmanTree(nodes); |
| System.out.println("前序遍历"); |
| huffmanTreeRoot.preOrder(); |
| } |
| |
| |
| private static void preOrder(Node root) { |
| if(root != null) { |
| root.preOrder(); |
| }else { |
| System.out.println("赫夫曼树为空"); |
| } |
| } |
| |
| |
| |
| |
| |
| private static List<Node> getNodes(byte[] bytes) { |
| |
| ArrayList<Node> nodes = new ArrayList<Node>(); |
| |
| Map<Byte, Integer> counts = new HashMap<>(); |
| for (byte b : bytes) { |
| Integer count = counts.get(b); |
| if (count == null) { |
| counts.put(b, 1); |
| } else { |
| counts.put(b, count + 1); |
| } |
| } |
| |
| |
| for(Map.Entry<Byte, Integer> entry: counts.entrySet()) { |
| nodes.add(new Node(entry.getKey(), entry.getValue())); |
| } |
| return nodes; |
| } |
| |
| |
| private static Node createHuffmanTree(List<Node> nodes) { |
| while(nodes.size() > 1) { |
| |
| Collections.sort(nodes); |
| |
| Node leftNode = nodes.get(0); |
| |
| Node rightNode = nodes.get(1); |
| |
| Node parent = new Node(null, leftNode.weight + rightNode.weight); |
| parent.left = leftNode; |
| parent.right = rightNode; |
| |
| nodes.remove(leftNode); |
| nodes.remove(rightNode); |
| |
| nodes.add(parent); |
| } |
| |
| return nodes.get(0); |
| } |
| |
| } |
| |
| |
| class Node implements Comparable<Node> { |
| Byte data; |
| int weight; |
| Node left; |
| Node right; |
| |
| public Node(Byte data, int weight) { |
| this.data = data; |
| this.weight = weight; |
| } |
| |
| @Override |
| public int compareTo(Node o) { |
| |
| return this.weight - o.weight; |
| } |
| |
| @Override |
| public String toString() { |
| return "Node [data = " + data + " weight=" + weight + "]"; |
| } |
| |
| |
| public void preOrder() { |
| System.out.println(this); |
| if(this.left != null) { |
| this.left.preOrder(); |
| } |
| if(this.right != null) { |
| this.right.preOrder(); |
| } |
| } |
| |
| } |
| |
| |
| |
| |
| static Map<Byte, String> huffmanCodes = new HashMap<Byte,String>(); |
| |
| static StringBuilder stringBuilder = new StringBuilder(); |
| |
| |
| private static Map<Byte, String> getCodes(Node root) { |
| if(root == null) { |
| return null; |
| } |
| |
| getCodes(root.left, "0", stringBuilder); |
| |
| getCodes(root.right, "1", stringBuilder); |
| return huffmanCodes; |
| } |
| |
| |
| |
| |
| |
| |
| |
| private static void getCodes(Node node, String code, StringBuilder stringBuilder) { |
| StringBuilder stringBuilder2 = new StringBuilder(stringBuilder); |
| |
| stringBuilder2.append(code); |
| if(node != null) { |
| |
| if(node.data == null) { |
| |
| |
| getCodes(node.left, "0", stringBuilder2); |
| |
| getCodes(node.right, "1", stringBuilder2); |
| } else { |
| |
| huffmanCodes.put(node.data, stringBuilder2.toString()); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| private static byte[] zip(byte[] bytes, Map<Byte, String> huffmanCodes) { |
| |
| StringBuilder stringBuilder = new StringBuilder(); |
| |
| for(byte b: bytes) { |
| stringBuilder.append(huffmanCodes.get(b)); |
| } |
| |
| |
| |
| int len; |
| if(stringBuilder.length() % 8 == 0) { |
| len = stringBuilder.length() / 8; |
| } else { |
| len = stringBuilder.length() / 8 + 1; |
| } |
| |
| byte[] huffmanCodeBytes = new byte[len]; |
| int index = 0; |
| for (int i = 0; i < stringBuilder.length(); i += 8) { |
| String strByte; |
| if(i+8 > stringBuilder.length()) { |
| strByte = stringBuilder.substring(i); |
| }else{ |
| strByte = stringBuilder.substring(i, i + 8); |
| } |
| |
| huffmanCodeBytes[index] = (byte)Integer.parseInt(strByte, 2); |
| index++; |
| } |
| return huffmanCodeBytes; |
| } |
| public class HuffmanCode { |
| public static void main(String[] args) { |
| String content = "i like like like java do you like a java"; |
| byte[] contentBytes = content.getBytes(); |
| System.out.println(contentBytes.length); |
| |
| List<Node> nodes = getNodes(contentBytes); |
| System.out.println("nodes=" + nodes); |
| |
| |
| System.out.println("赫夫曼树"); |
| Node huffmanTreeRoot = createHuffmanTree(nodes); |
| System.out.println("前序遍历"); |
| huffmanTreeRoot.preOrder(); |
| |
| |
| Map<Byte, String> huffmanCodes = getCodes(huffmanTreeRoot); |
| System.out.println("~生成的赫夫曼编码表= " + huffmanCodes); |
| |
| |
| byte[] huffmanCodeBytes = zip(contentBytes, huffmanCodes); |
| System.out.println("huffmanCodeBytes=" + Arrays.toString(huffmanCodeBytes)); |
| } |
| } |
| public class HuffmanCode { |
| public static void main(String[] args) { |
| String content = "i like like like java do you like a java"; |
| byte[] contentBytes = content.getBytes(); |
| System.out.println(contentBytes.length); |
| |
| byte[] huffmanCodesBytes= huffmanZip(contentBytes); |
| System.out.println("压缩后的结果是:" + Arrays.toString(huffmanCodesBytes) + " 长度= " + huffmanCodesBytes.length); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| private static byte[] huffmanZip(byte[] bytes) { |
| List<Node> nodes = getNodes(bytes); |
| |
| Node huffmanTreeRoot = createHuffmanTree(nodes); |
| |
| Map<Byte, String> huffmanCodes = getCodes(huffmanTreeRoot); |
| |
| byte[] huffmanCodeBytes = zip(bytes, huffmanCodes); |
| return huffmanCodeBytes; |
| } |
| public class HuffmanCode { |
| public static void main(String[] args) { |
| String content = "i like like like java do you like a java"; |
| byte[] contentBytes = content.getBytes(); |
| System.out.println(contentBytes.length); |
| |
| byte[] huffmanCodesBytes= huffmanZip(contentBytes); |
| System.out.println("压缩后的结果是:" + Arrays.toString(huffmanCodesBytes) + " 长度= " + huffmanCodesBytes.length); |
| |
| |
| |
| byte[] sourceBytes = decode(huffmanCodes, huffmanCodesBytes); |
| System.out.println("原来的字符串=" + new String(sourceBytes)); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| private static byte[] decode(Map<Byte,String> huffmanCodes, byte[] huffmanBytes) { |
| |
| StringBuilder stringBuilder = new StringBuilder(); |
| |
| for(int i = 0; i < huffmanBytes.length; i++) { |
| byte b = huffmanBytes[i]; |
| |
| boolean flag = (i == huffmanBytes.length - 1); |
| stringBuilder.append(byteToBitString(!flag, b)); |
| } |
| |
| |
| Map<String, Byte> map = new HashMap<String,Byte>(); |
| for(Map.Entry<Byte, String> entry: huffmanCodes.entrySet()) { |
| map.put(entry.getValue(), entry.getKey()); |
| } |
| |
| List<Byte> list = new ArrayList<>(); |
| |
| for(int i = 0; i < stringBuilder.length(); ) { |
| int count = 1; |
| boolean flag = true; |
| Byte b = null; |
| while(flag) { |
| |
| |
| String key = stringBuilder.substring(i, i+count); |
| b = map.get(key); |
| if(b == null) { |
| count++; |
| }else { |
| |
| flag = false; |
| } |
| } |
| list.add(b); |
| i += count; |
| } |
| |
| |
| byte b[] = new byte[list.size()]; |
| for(int i = 0;i < b.length; i++) { |
| b[i] = list.get(i); |
| } |
| return b; |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| private static String byteToBitString(boolean flag, byte b) { |
| |
| int temp = b; |
| |
| if(flag) { |
| temp |= 256; |
| } |
| String str = Integer.toBinaryString(temp); |
| if(flag) { |
| return str.substring(str.length() - 8); |
| } else { |
| return str; |
| } |
| } |
| public class HuffmanCode { |
| |
| public static void main(String[] args) { |
| |
| String srcFile = "d://Uninstall.xml"; |
| String dstFile = "d://Uninstall.zip"; |
| zipFile(srcFile, dstFile); |
| System.out.println("压缩文件ok~~"); |
| |
| |
| String zipFile = "d://Uninstall.zip"; |
| String dstFile = "d://Uninstall2.xml"; |
| unZipFile(zipFile, dstFile); |
| System.out.println("解压成功!"); |
| } |
| |
| |
| |
| |
| |
| |
| public static void unZipFile(String zipFile, String dstFile) { |
| |
| InputStream is = null; |
| |
| ObjectInputStream ois = null; |
| |
| OutputStream os = null; |
| try { |
| |
| is = new FileInputStream(zipFile); |
| |
| ois = new ObjectInputStream(is); |
| |
| byte[] huffmanBytes = (byte[])ois.readObject(); |
| |
| Map<Byte,String> huffmanCodes = (Map<Byte,String>)ois.readObject(); |
| |
| byte[] bytes = decode(huffmanCodes, huffmanBytes); |
| |
| os = new FileOutputStream(dstFile); |
| |
| os.write(bytes); |
| } catch (Exception e) { |
| |
| System.out.println(e.getMessage()); |
| } finally { |
| try { |
| os.close(); |
| ois.close(); |
| is.close(); |
| } catch (Exception e2) { |
| |
| System.out.println(e2.getMessage()); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| public static void zipFile(String srcFile, String dstFile) { |
| |
| OutputStream os = null; |
| ObjectOutputStream oos = null; |
| |
| FileInputStream is = null; |
| try { |
| |
| is = new FileInputStream(srcFile); |
| |
| byte[] b = new byte[is.available()]; |
| |
| is.read(b); |
| |
| byte[] huffmanBytes = huffmanZip(b); |
| |
| os = new FileOutputStream(dstFile); |
| |
| oos = new ObjectOutputStream(os); |
| |
| oos.writeObject(huffmanBytes); |
| |
| |
| oos.writeObject(huffmanCodes); |
| }catch (Exception e) { |
| |
| System.out.println(e.getMessage()); |
| }finally { |
| try { |
| is.close(); |
| oos.close(); |
| os.close(); |
| }catch (Exception e) { |
| |
| System.out.println(e.getMessage()); |
| } |
| } |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术