TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一个哈夫曼压缩与解压缩程序,能正常解压与压缩,但解压时间较长,有待改进.
- import java.util.ArrayDeque;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import java.util.Queue;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Iterator;
-
- public class HuffmanTree< T> {
- //创建一个Map存放字符与码表的键值对,即码表
- private java.util.HashMap< T,String > map=new HashMap< T, String>();
- //创建一个队列存放关键码
- private List< T> list = new ArrayList < T> ();
-
- public HashMap< T, String> getMap() {
- return map;
- }
- public void setMap(HashMap< T, String> map) {
- this.map = map;
- }
- public List< T> getList() {
- return list;
- }
- public void setList(List
-
- list) {
- this.list = list;
- }
- /**
- * 由节点队列创建哈夫曼树
- *
- * @param nodes
- * :传入的队列
- * @return:哈夫曼树的节点
- */
-
-
- public Node< T> createTree(List< Node< T>> nodes){
- while(nodes.size() > 1){
- Collections.sort(nodes);
- Node< T> left = nodes.get(nodes.size()-1);
- Node< T> right = nodes.get(nodes.size()-2);
- Node< T> parent = new Node
-
- (null, left.getWeight()+right.getWeight());
- parent.setLeft(left);
- parent.setRight(right);
- nodes.remove(left);
- nodes.remove(right);
- nodes.add(parent);
- }
- return nodes.get(0);
- }
-
-
- /**
- * 创建哈夫曼编码
- * @param root
- * @param hfmCode
- */
- public void createHfmCode(Node< T> root, String hfmCode) {
-
- if (root != null) {
- if (root.getLeft() == null) {
- //System.out.println(root.getData());
- //System.out.println("该节点的哈夫曼编码:" + hfmCode);
- //将指定的值与此映射中的指定键关联,即将T与它的哈夫曼编码一一对应存放进Map
- map.put(root.getData(), hfmCode);
- //将根节点的字符即Map的关键码存放进队列
- list.add(root.getData());
- }
- createHfmCode(root.getLeft(),hfmCode+"0");
- createHfmCode(root.getRight(),hfmCode+"1");
- }
- }
- /**
- * 打印输出哈夫曼编码
- * @param root
- * @param hfmCode
- */
- public void printHuffman(Node< T> root, String hfmCode) {
-
- Iterator< Map.Entry< T,String>> iter = map.entrySet().iterator();
-
- while (iter.hasNext()) {
- Map.Entry< T,String> entry =iter.next();
- T t=entry.getKey();
- String val = entry.getValue();
- System.out.println(t.toString()+"-->"+val);
-
- }
- /*if (root != null) {
-
- if (root.getLeft() == null) {
- //打印叶节点的相关信息
- System.out.println(root.getData());
- System.out.println("该叶节点的权值:" + root.getWeight());
- System.out.println("该节点的哈夫曼编码:" + hfmCode);
- }
- Node
-
- lNode = root.getLeft();
- printHuffman(lNode, hfmCode + "0");
- Node
-
- rNode = root.getRight();
- printHuffman(rNode, hfmCode + "1");
- }*/
- }
-
- public static < T> List< Node< T>> breadth(Node< T> root){ //广度优先遍历哈夫曼树
- List< Node< T>> list = new ArrayList< Node< T>>();
- Queue< Node< T>> queue = new ArrayDeque< Node< T>>();
-
- if(root != null){
- queue.offer(root);
- }
-
- while(!queue.isEmpty()){
- list.add(queue.peek());
- Node
-
- node = queue.poll();
-
- if(node.getLeft() != null){
- queue.offer(node.getLeft());
- }
-
- if(node.getRight() != null){
- queue.offer(node.getRight());
- }
- }
- return list;
- }
- }
-
-
-
-
-
复制代码 其它程序请下载.
源码下载:http://file.javaxxz.com/2014/11/3/235826281.zip |
|