生活随笔
收集整理的這篇文章主要介紹了
赫夫曼编码字节数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路分析
代碼實現
package com
.atguigu
.huffmancode
;import com
.sun
.org
.glassfish
.external
.statistics
.CountStatistic
;
import com
.sun
.org
.glassfish
.external
.statistics
.StringStatistic
;import java
.util
.*
;
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
);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(Arrays
.toString(huffmanCodeBytes
));}private static byte[] zip(byte[] bytes
,Map
<Byte,String> huffmanCodes
){StringBuilder stringBuilder
= new StringBuilder();for(byte b
:bytes
){stringBuilder
.append(huffmanCodes
.get(b
));}System
.out
.println("測試stringBuilder="+stringBuilder
.toString());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
;}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 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<>();HashMap
<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
;}@Overridepublic int compareTo(Node o
) {return this.weight
-o
.weight
;}@Overridepublic 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();}}}
總結
以上是生活随笔為你收集整理的赫夫曼编码字节数组的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。