zoukankan      html  css  js  c++  java
  • java实现Haffman编码

    1、先创建一个树节点类(泛型类),为了方便使用集合的排序方法,泛型类要实现泛型接口Comparable,代码如下

    package com.hjp.huffman;
    
    /**
     * Created by JiaPeng on 2016/12/28.
     */
    public class Node<T> implements Comparable<Node<T>> {
    
        private T data;
        private int weight;
        private Node<T> left;
        private Node<T> right;
        private String codeStr;
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        public Node<T> getLeft() {
            return left;
        }
    
        public void setLeft(Node<T> left) {
            this.left = left;
        }
    
        public Node<T> getRight() {
            return right;
        }
    
        public void setRight(Node<T> right) {
            this.right = right;
        }
    
        public Node(T data, int weight) {
            this.data = data;
            this.weight = weight;
        }
    
        public String getCodeStr() {
            return codeStr;
        }
    
        public void setCodeStr(String codeStr) {
            this.codeStr = codeStr;
        }
    
        @Override
        public int compareTo(Node<T> o) {
            if (o.weight > this.weight) {
                return 1;
            } else if (o.weight < this.weight) {
                return -1;
            }
            return 0;
        }
    
        @Override
        public String toString() {
            return "data:" + this.data + ",weight:" + this.weight + "; ";
        }
    }
    树节点类

    2、编写泛型静态方法,构造Haffman树及对树编码,代码如下

    package com.hjp.huffman;
    
    import java.util.*;
    
    /**
     * Created by JiaPeng on 2016/12/28.
     */
    public class HuffmanTree {
    
        public static <T> Node<T> createTree(List<Node<T>> nodes) {
            while (nodes.size() > 1) {
                int nodesLen = nodes.size();
                Collections.sort(nodes);
                Node<T> left = nodes.get(nodesLen - 1);
                Node<T> right = nodes.get(nodesLen - 2);
                Node<T> parent = new Node<T>(null, left.getWeight() + right.getWeight());
                parent.setLeft(left);
                parent.setRight(right);
                nodes.remove(left);
                nodes.remove(right);
                nodes.add(parent);
            }
            return nodes.get(0);
        }
    
        public static <T> List<Node<T>> breath(Node<T> root) {
            List<Node<T>> list = new ArrayList<Node<T>>();
            Queue<Node<T>> queue = new LinkedList<Node<T>>();
            queue.add(root);
            StringBuilder stringBuilder = new StringBuilder();
            while (!queue.isEmpty()) {
                Node<T> pNode = queue.poll();
                list.add(pNode);
                Node<T> leftNode = pNode.getLeft();
                String codeStr = pNode.getCodeStr();
                if (leftNode != null) {
                    if (codeStr != null && !"".equals(codeStr)) {
                        leftNode.setCodeStr(codeStr + "0");
                    } else {
                        leftNode.setCodeStr("0");
                    }
                    queue.add(leftNode);
                }
                Node<T> rightNode = pNode.getRight();
                if (rightNode != null) {
                    if (codeStr != null && !"".equals(codeStr)) {
                        rightNode.setCodeStr(codeStr + "1");
                    } else {
                        rightNode.setCodeStr("1");
                    }
                    queue.add(rightNode);
                }
            }
            return list;
        }
    
    }
    构造树方法及编码方法

    3、测试方法

    package com.hjp.huffman;
    
    import com.hjp.data.JSONUtil;
    
    import java.util.ArrayList;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by JiaPeng on 2016/12/28.
     */
    public class testMain {
    
        public static void main(String[] args){
            List<Node<String>> nodes = new ArrayList<Node<String>>();
            nodes.add(new Node<String>("b", 5));
            nodes.add(new Node<String>("a", 7));
            nodes.add(new Node<String>("d", 2));
            nodes.add(new Node<String>("c", 4));
            Node<String> root = HuffmanTree.createTree(nodes);
            List<Node<String>> huffmanList=HuffmanTree.breath(root);
            Map<String,String> huffmanMap=new LinkedHashMap<String, String>();
            for (int i = 0; i < huffmanList.size(); i++) {
                Node<String> curNode=huffmanList.get(i);
                if(curNode.getData()!=null){
                    huffmanMap.put(curNode.getData(),curNode.getCodeStr());
                }
            }
            System.out.println(JSONUtil.toJson(huffmanMap));
        }
    
    }
    测试方法
  • 相关阅读:
    Codeforces 543E. Listening to Music
    UOJ #138. 【UER #3】开学前的涂鸦
    bzoj 3569: DZY Loves Chinese II
    bzoj 2428: [HAOI2006]均分数据
    bzoj 4589: Hard Nim
    UOJ #119. 【UR #8】决战圆锥曲线
    spoj5973
    codeforces555E
    poj1275
    bzoj4152
  • 原文地址:https://www.cnblogs.com/hujiapeng/p/6229740.html
Copyright © 2011-2022 走看看