【算法設(shè)計(jì)與分析】哈夫曼編碼 (JAVA代碼實(shí)現(xiàn))——貪心算法

JAVA代碼實(shí)現(xiàn)

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;
    }

    /**
     * 創(chuàng)建節(jié)點(diǎn)數(shù)
     * @param str 需要編碼數(shù)據(jù)
     * @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;
    }

    /**
     * 進(jìn)行編碼
     * @param root  數(shù)
     * @param code 存儲(chǔ)編碼
     * @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();
    }
}


執(zhí)行程序

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);
    }

}

執(zhí)行截圖

執(zhí)行.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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橘霎,一起剝皮案震驚了整個(gè)濱河市笙各,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸠窗,老刑警劉巖尺借,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶岸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芍阎,警方通過查閱死者的電腦和手機(jī)世曾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谴咸,“玉大人轮听,你說我怎么就攤上這事×爰眩” “怎么了血巍?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)珊随。 經(jīng)常有香客問我述寡,道長(zhǎng),這世上最難降的妖魔是什么叶洞? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任鲫凶,我火速辦了婚禮,結(jié)果婚禮上衩辟,老公的妹妹穿的比我還像新娘螟炫。我一直安慰自己,他們只是感情好惭婿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布不恭。 她就那樣靜靜地躺著,像睡著了一般财饥。 火紅的嫁衣襯著肌膚如雪换吧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天钥星,我揣著相機(jī)與錄音沾瓦,去河邊找鬼。 笑死谦炒,一個(gè)胖子當(dāng)著我的面吹牛贯莺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宁改,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缕探,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了还蹲?” 一聲冷哼從身側(cè)響起爹耗,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谜喊,沒想到半個(gè)月后潭兽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斗遏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年山卦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诵次。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡账蓉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逾一,到底是詐尸還是另有隱情剔猿,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布嬉荆,位于F島的核電站归敬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鄙早。R本人自食惡果不足惜汪茧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望限番。 院中可真熱鬧舱污,春花似錦、人聲如沸弥虐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至珠插,卻和暖如春惧磺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捻撑。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工磨隘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顾患。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓番捂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親江解。 傳聞我的和親對(duì)象是個(gè)殘疾皇子设预,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容