美文网首页
【算法设计与分析】哈夫曼编码 (JAVA代码实现)——贪心算法

【算法设计与分析】哈夫曼编码 (JAVA代码实现)——贪心算法

作者: 说好不哭让我走 | 来源:发表于2020-12-16 19:55 被阅读0次

JAVA代码实现

Huffman

package cn.fyfye.algorithm.huffman;

import java.util.*;

public class Huffman implements Comparable<Huffman> {


    private Integer weight;
    private Character name;
    private Integer val;

    private Huffman lChildren;
    private Huffman rChildren;

    public Huffman() {
    }

    public Huffman(Integer weight, Character name, Integer val, Huffman lChildren, Huffman rChildren) {
        this.weight = weight;
        this.name = name;
        this.val = val;
        this.lChildren = lChildren;
        this.rChildren = rChildren;
    }

    /**
     * 创建节点数
     * @param str 需要编码数据
     * @return
     */
    public static Huffman createHuffmanRootNode(StringBuffer str) {
        Huffman root = null;
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for (int i = 0; i < str.length(); i++) {
            if (map.containsKey(str.charAt(i))) {
                Integer val = map.get(str.charAt(i));
                map.put(str.charAt(i), val + 1);
            } else {
                map.put(str.charAt(i), 1);
            }
        }
        LinkedList<Huffman> listNode = new LinkedList<>();
        for (Map.Entry<Character, Integer> en : map.entrySet()) {
            Huffman huffman = new Huffman(en.getValue(), en.getKey(), 0, null, null);
            listNode.add(huffman);
        }
        Collections.sort(listNode);
        root = binaryTree(listNode);
        return root;
    }

    private static Huffman binaryTree(LinkedList<Huffman> listNode) {
        Huffman root = null;
        while (listNode.size()>0){
            if(listNode.size()==1){
               Huffman left = listNode.removeFirst();
               left.setVal(0);
               return new Huffman(left.getWeight(),null,0,left,null);
            }
            Huffman left = listNode.removeFirst();
            Huffman right = listNode.removeFirst();
            left.setVal(0);
            right.setVal(1);
            if(listNode.size()==0){
                root = new  Huffman(left.getWeight()+right.getWeight(),null,0,left,right);
            }else{
                Huffman huffman = new Huffman(left.getWeight() + right.getWeight(), null, 0, left, right);
                listNode.add(huffman);
                Collections.sort(listNode);
            }
        }
        return root;
    }

    /**
     * 进行编码
     * @param root  数
     * @param code 存储编码
     * @return
     */
    public static String encode(Huffman root,HashMap<Character,String> code){
        StringBuffer sb = new StringBuffer();
        findNodeVal(root,code,new StringBuffer());
        for(Map.Entry<Character, String> set :code.entrySet()){
            sb.append(set.getValue());
        }
        return sb.toString();
    }

    private static void findNodeVal(Huffman root,HashMap<Character,String> code,StringBuffer s){
        if(null != root){
            if(null == root.getLChildren() && null == root.getRChildren()){
                s.append(root.getVal());
                code.put(root.getName(),s.substring(1));
                s.deleteCharAt(s.length()-1);
            }
            s.append(root.getVal());
            if(null != root.getLChildren()){
                findNodeVal(root.getLChildren(),code,s);
            }
            if(null != root.getRChildren()){
                findNodeVal(root.getRChildren(),code,s);
            }
            s.deleteCharAt(s.length()-1);
        }
    }


    @Override
    public int compareTo(Huffman o) {
        return this.getWeight()-o.getWeight();
    }
}


执行程序

package cn.fyfye.algorithm.huffman;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class HuffmanTest {

    public static void main(String[] args) {
         StringBuffer str = new StringBuffer("dsfdskxclvcxvzxxzcasdwfmvvddfdfdfdfdfoibofibfpdob");
        HashMap<Character,String> code = new HashMap<>();
        Huffman rootNode = Huffman.createHuffmanRootNode(str);
        System.out.println(rootNode);
        String encode = Huffman.encode(rootNode, code);
        System.out.println(encode);
        System.out.println(code);
    }

}

执行截图

执行.png
Huffman(weight=49, name=null, val=0, lChildren=Huffman(weight=19, name=null, val=0, lChildren=Huffman(weight=9, name=f, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=10, name=d, val=1, lChildren=null, rChildren=null)), rChildren=Huffman(weight=30, name=null, val=1, lChildren=Huffman(weight=13, name=null, val=0, lChildren=Huffman(weight=6, name=null, val=0, lChildren=Huffman(weight=3, name=c, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=3, name=o, val=1, lChildren=null, rChildren=null)), rChildren=Huffman(weight=7, name=null, val=1, lChildren=Huffman(weight=3, name=s, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=4, name=null, val=1, lChildren=Huffman(weight=2, name=null, val=0, lChildren=Huffman(weight=1, name=a, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=1, name=k, val=1, lChildren=null, rChildren=null)), rChildren=Huffman(weight=2, name=i, val=1, lChildren=null, rChildren=null)))), rChildren=Huffman(weight=17, name=null, val=1, lChildren=Huffman(weight=8, name=null, val=0, lChildren=Huffman(weight=4, name=null, val=0, lChildren=Huffman(weight=2, name=null, val=0, lChildren=Huffman(weight=1, name=p, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=1, name=w, val=1, lChildren=null, rChildren=null)), rChildren=Huffman(weight=2, name=null, val=1, lChildren=Huffman(weight=1, name=l, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=1, name=m, val=1, lChildren=null, rChildren=null))), rChildren=Huffman(weight=4, name=v, val=1, lChildren=null, rChildren=null)), rChildren=Huffman(weight=9, name=null, val=1, lChildren=Huffman(weight=4, name=x, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=5, name=null, val=1, lChildren=Huffman(weight=2, name=z, val=0, lChildren=null, rChildren=null), rChildren=Huffman(weight=3, name=b, val=1, lChildren=null, rChildren=null))))))
101100111111000010010111101101110010110011100111000010101101110001111011110
{a=101100, b=11111, c=1000, d=01, f=00, i=10111, k=101101, l=110010, m=110011, o=1001, p=110000, s=1010, v=1101, w=110001, x=1110, z=11110}

注:代码仅供参考

作者QQ:420318184
邮箱:fy@0fy0.com

相关文章

  • 贪心算法:使用贪心算法实现哈夫曼编码

    文章结构 如何理解贪心算法 贪心算法实例分析 使用贪心算法实现哈夫曼编码 源码地址 说明 算法中基本的算法思想有:...

  • 基于哈夫曼算法的压缩解压缩程序--python实现

    一.实现效果 【压缩】 【解压缩】 【压缩效率】 二.哈夫曼算法 哈夫曼又称霍夫曼编码,是一种编码方式,哈夫曼编码...

  • 【恋上数据结构与算法一】(十六)哈夫曼树

    哈夫曼编码(Huffman Coding) ◼ 哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础 ◼ 假设要把...

  • Huffman树及Huffman编码

    Huffman树及Huffman编码 一.实验目的 掌握哈夫曼树的构造算法、哈夫曼编码原理。 二.实验要求与内容 ...

  • 哈夫曼编码

    实验目的: (1) 掌握二叉树的定义; (2) 掌握哈夫曼树和哈夫曼编码算法的实现。 实验内容: 实现一个哈夫曼编...

  • 数据结构-哈夫曼树

    哈夫曼编码(Huffman Coding) ◼ 哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础◼ 假设要把字...

  • 19-哈夫曼树

    哈夫曼编码(Huffman Coding) 哈夫曼编码,又称霍夫曼编码,它是现代压缩算法的基础。 假如我们现在有这...

  • 二十五、哈夫曼树

    哈夫曼编码(Huffman Coding) 哈夫曼编码,又称为霍夫曼编码,它是现代压缩算法的基础 假设要把字符串【...

  • 18_哈夫曼树

    哈夫曼编码的用途 哈夫曼编码,又称霍夫曼编码,它是现代压缩算法的基础 假设要把字符串【ABBBBCCCCCCCCD...

  • 数据结构与算法(第一季):哈夫曼编码

    一、哈夫曼编码 哈夫曼编码,它是现代压缩算法的基础。 假设把字符串"ABBBCCCCCCDDDDDDEE"转成二进...

网友评论

      本文标题:【算法设计与分析】哈夫曼编码 (JAVA代码实现)——贪心算法

      本文链接:https://www.haomeiwen.com/subject/klxtnktx.html