日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

哈夫曼编码之大根堆小根堆揭西县

發布時間:2025/4/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈夫曼编码之大根堆小根堆揭西县 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

哈夫曼編碼
根據數據出現的頻率對數據進行編碼,從而壓縮原始數據。

例如對于一個文本文件,其中各種字符出現的次數如下:

a : 10
b : 20
c : 40
d : 80
可以將每種字符轉換成二進制編碼,例如將 a 轉換為 00,b 轉換為 01,c 轉換為 10,d 轉換為 11。這是最簡單的一種編碼方式,沒有考慮各個字符的權值(出現頻率)。而哈夫曼編碼采用了貪心策略,使出現頻率最高的字符的編碼最短,從而保證整體的編碼長度最短。

首先生成一顆哈夫曼樹,每次生成過程中選取頻率最少的兩個節點,生成一個新節點作為它們的父節點,并且新節點的頻率為兩個節點的和。選取頻率最少的原因是,生成過程使得先選取的節點位于樹的更低層,那么需要的編碼長度更長,頻率更少可以使得總編碼長度更少。

import java.util.HashMap; import java.util.Map; import java.util.PriorityQueue;public class hufman { private class Node implements Comparable<Node>{char ch;int frequency;boolean isleaf;Node left;Node right;public Node(char a,int f) {ch=a;frequency=f;isleaf=true;}public Node(Node left,Node right,int frequency) {this.left=left;this.right=right;this.frequency=frequency;}@Overridepublic int compareTo(Node o) {// TODO Auto-generated method stubreturn this.frequency-o.frequency;} }public Map<Character,String> encode(Map<Character,Integer> frquencyChar){PriorityQueue<Node> p=new PriorityQueue();for(char c:frquencyChar.keySet()) {p.add(new Node(c,frquencyChar.get(c)));}while(p.size()!=1) {Node n1= p.poll();Node n2= p.poll();p.add(new Node(n1,n2,n1.frequency+n2.frequency));}return Encode(p.poll());}public Map<Character,String> Encode(Node root){Map<Character,String> m=new HashMap();Encode(root,"",m);return m;}public void Encode(Node node,String a,Map<Character,String> m) {while(node.isleaf) {m.put(node.ch, a);return;}Encode(node.left,a+"0",m);Encode(node.right,a+"1",m);}} man.java import java.util.HashMap; import java.util.Map;public class Teat {public static void main(String[] args) {// TODO Auto-generated method stubMap <Character,Integer> frquencyChar=new HashMap();frquencyChar.put('a', 1);frquencyChar.put('c', 19);frquencyChar.put('2', 13);frquencyChar.put('5', 14);hufman a=new hufman();Map<Character,String> b=a.encode(frquencyChar);for(char m:b.keySet()) {System.out.println(m+b.get(m));}}}

這是一個大根堆,所以重寫了Node 對象中的compareTo 函數, 繼承 Comparable 接口,
首先將字符與權重加入一個map中,我理解的是構建小根堆,這樣每次都是最小的現出來。相加構成節點這個樣子。
重寫了函數之后,compare這個函數我覺得是》0 就要交換,<0 不交換,this.fre-o.fre>0 說明后來者小,進行交換。

PriorityQueue <Integer> maxHeap = new PriorityQueue<Integer>( new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// TODO Auto-generated method stubreturn o2.compareTo(o1);}});

還可以 通過這個樣子重寫進行大根堆 小根堆變換。
https://blog.csdn.net/liou825/article/details/21322403
https://blog.csdn.net/zcf1784266476/article/details/68961473

總結

以上是生活随笔為你收集整理的哈夫曼编码之大根堆小根堆揭西县的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线观看国产视频 | 日本一区二区视频在线播放 | 福利资源在线观看 | 国产精品久久久久久久久久久久久久久久 | 91青草视频| 久久性生活片 | 一色道久久88加勒比一 | xx69欧美| 色网站在线观看 | 热久久在线 | 亚洲成人黄色网 | 日韩精品一卡 | 大陆一级片| 日韩av三级在线观看 | 亚洲国产视频在线 | 国产动漫av| 久久久99精品免费观看 | 天天久久| 国产免费a | 亚洲色图图片区 | 亚洲人成在线观看 | 免费视频亚洲 | 污视频在线网站 | 最近最经典中文mv字幕 | 日本黄频 | 天天爽夜夜爽一区二区三区 | 亚洲色成人www永久网站 | 草久影院 | 天堂在线精品视频 | 在线免费播放av | 高清二区 | 久久青青草视频 | 无码人妻一区二区三区精品视频 | 日本啊v在线| 草草影院在线 | 春意影院福利社 | 午夜片在线观看 | 一出一进一爽一粗一大视频 | 成人影| 亚洲综合一二三 | xxxxx在线 | 欧洲av在线 | 欧日韩在线视频 | 高清免费av| jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 日本免费色 | 欧美日韩三级 | 激情涩涩 | 神马午夜场| 农村妇女毛片精品久久久 | 午夜免费福利小视频 | 成人免费影院 | 伊人66| 老牛av一区二区 | 红桃视频一区二区三区免费 | 91麻豆蜜桃一区二区三区 | 最新网址av| 毛色毛片 | 蜜臀av性久久久久蜜臀aⅴ | 欧美a∨亚洲欧美亚洲 | 国产成人精品一区二区三区免费 | 亚洲第九页 | 精品一区二区三区欧美 | 亚洲精品一区二区三区影院忠贞 | 久久久久久久久久久久久久国产 | yy6080久久 | 国产精品99一区二区三区 | 亚洲视频中文 | 99免费在线视频 | 日韩高清精品免费观看 | 欧美亚洲日本一区 | 日韩在线观看视频免费 | 97网站| 在线视频免费播放 | 尤物91| 毛片一区二区 | 91日本在线观看 | 欧美色爽 | 6080黄色| 涩涩视频免费在线观看 | 国产精品色哟哟 | 欧美做爰性生交视频 | 欧美福利影院 | 国产精品天美传媒入口 | 亚洲AV无码国产精品播放在线 | 久久久久亚洲av无码麻豆 | a极黄色片 | 一级看片 | 黄色小视频入口 | 欧美综合自拍亚洲综合图片区 | 福利资源导航 | a级黄色网 | 日韩中文字幕二区 | 天天插日日插 | 顶级黄色片 | 爱爱视频在线看 | 色中文在线 | 欧美日韩a v | 色多多在线看 |