亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

哈夫曼樹的建立

系統 1689 0

?哈夫曼算法一般用來實現數據壓縮,以另外一種規則存儲數據,從而達到壓縮的功能。

?

????? 以下是我編寫的一個哈夫曼樹的例子:

?????

????? 程序描述 :1.傳入一個字符串,將之分解,得到每個字符的個數,個數即為權值????

?????????????????????2.將每一個字符和他的權值傳入一個HFMNode對象中,?再將該對象傳入一個隊列中

???????????????????? 3.將隊列中的HFMNode對象按權值大小排序,每次取其中權值最小的兩個對象,生成一個二叉樹,

??????????????????????? 向array中刪除這兩個權值最小的節點,同時添加該兩對象的父節點

???????????????????? 4.編碼?? 按規則:從根節點開始,向左走一步編碼加+1,向右走一步編碼+0

?

?

???? 以下為源碼:

?

?哈夫曼節點的類

package tree;???????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
public class HFMNode {??????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? //節點一共有三種:????????????????????????????????????????????????????????????????????????????????????????
? //1.根節點????????? 根節點沒有父節點?????????????????????????????????????????????????????????????????????????
? //2.葉節點????????? 沒有子節點????????????????????????????????????????????????????????????????????????????
? //3.中間節點???? 有父節點和子節點?????????????????????????????????????????????????????????????????????????????
? private? HFMNode parent ;?????????????????????????????????????????????????????????????????????????
? private? HFMNode leftChild ;??????????????????????????????????????????????????????????????????????
? private? HFMNode rightChild;??????????????????????????????????????????????????????????????????????
? private? char s ;//節點所儲存的字符???????????????????????????????????????????????????????????????????????
? private? int weight=0 ;//所儲存節點的權值?????????????????????????????????????????????????????????????????
? private? String code="" ;//字符對應的哈夫曼編碼?????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setParent(HFMNode parent){????????????????????????????????????????????????????????????
?? this.parent = parent ;????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
? public HFMNode getParent(){???????????????????????????????????????????????????????????????????????
?? return this.parent ;??????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setLeftChild(HFMNode leftChild){??????????????????????????????????????????????????????
?? this.leftChild = leftChild ;??????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
? public HFMNode getLeftChild(){????????????????????????????????????????????????????????????????????
?? return this.leftChild ;???????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setRightChild(HFMNode rightChild){????????????????????????????????????????????????????
?? this.rightChild = rightChild ;????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
? public HFMNode getRightChild(){???????????????????????????????????????????????????????????????????
?? return this.rightChild ;??????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setWeight(int weight){????????????????????????????????????????????????????????????????
?? this.weight = weight ;????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
? public int getWeight(){???????????????????????????????????????????????????????????????????????????
?? return this.weight ;??????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setChar(char s){??????????????????????????????????????????????????????????????????????
?? this.s = s ;??????????????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
? public char getChar(){????????????????????????????????????????????????????????????????????????????
?? return this.s ;???????????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setCode(String code){?????????????????????????????????????????????????????????????????
?? this.code = code ;????????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
? public String getCode(){??????????????????????????????????????????????????????????????????????????
?? return this.code ;????????????????????????????????????????????????????????????????????????????
? }?????????????????????????????????????????????????????????????????????????????????????????????????
}??

?

?

?

? 哈夫曼樹的類 ?????

package tree;???????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????
import java.util.ArrayList;?????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????
public class ConstructHFM {?????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????????????????????????????????????????????????????????
?private String data ;//傳入的字符串???????????????????????????????????????????????????????????????????????????????
?private ArrayList<HFMNode> array = new ArrayList<HFMNode>();????????????????????????????????????????????????
?private ArrayList<HFMNode> nodeArray = new ArrayList<HFMNode>();//儲存所有的節點 ??????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????
? public ConstructHFM(String data) {???????????????????????????????????????????????????????????????????????????
??this.data = data ;??????????????????????????????????????????????????????????????????????????????????????
?}????????????????????????????????????????????????????????????????????????????????????????????????????????????
???/**

??? *得到字符串的編碼

????*/???????????????????????????????????????????????????????????????????????????????????????????????
? public void getStringCode() {????????????????????????????????????????????????????????????????????????????????
??this.setTreeNode();?????????????????????????????????????????????????????????????????????????????????????
??this.sortAndConsTree();?????????????????????????????????????????????????????????????????????????????????
??this.setEveryCharCode(array.get(0));????????????????????????????????????????????????????????????????????
??String allCode = this.getAllCode();?????????????????????????????????????????????????????????????????????
??System.out.println("*******************************************************");??? ???????????????????????
??System.out.println(data+"的哈夫曼編碼是:"+allCode);????????????????????????????????????????????????????????????
?}???????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?/**?????????????????????????????????????????????????????????????????????????????????????????????????????????
? * 得到不同的字符總數,???????????????????????????????????????????????????????????????????????????????????????????????
? * 將每一個字符和他的權值傳入一個HFMNode對象中,???????????????????????????????????????????????????????????????????????????????
? * 將此對象添加入隊列中???????????????????????????????????????????????????????????????????????????????????????????????
? */?????????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setTreeNode() {??????????????????????????????????????????????????????????????????????????????????
??char[] s = data.toCharArray();??????????????????????????????????????????????????????????????????????????
??int[] charCount = new int[s.length];//與字符數組相對應,記錄對應字符的個數????????????????????????????????????????????????
??for(int i=0 ;i<charCount.length ;i++){??????????????????????????????????????????????????????????????????
???charCount[i] = 1 ;??????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????
??//得到字符的數目,以及每個字符的個數?????????????????????????????????????????????????????????????????????????????????????
??for(int i=0 ; i<s.length ;i++){?????????????????????????????????????????????????????????????????????????
???for(int j=0 ; j<i ;j++){????????????????????????????????????????????????????????????????????????????
????if(s[i]==s[j]){?????????????????????????????????????????????????????????????????????????????????
?????charCount[j]++;?????????????????????????????????????????????????????????????????????????????
?????charCount[i]=0;?????????????????????????????????????????????????????????????????????????????
?????break;??????????????????????????????????????????????????????????????????????????????????????
????}???????????????????????????????????????????????????????????????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????
??//將字符傳入及節點對象????????????????????????????????????????????????????????????????????????????????????????????
??for(int i=0 ;i<s.length ;i++){??????????????????????????????????????????????????????????????????????????
???if(charCount[i]!=0){????????????????????????????????????????????????????????????????????????????????
????HFMNode? h = new HFMNode();?????????????????????????????????????????????????????????????????????
????h.setChar(s[i]) ;???????????????????????????????????????????????????????????????????????????????
????h.setWeight(charCount[i]);??????????????????????????????????????????????????????????????????????
????array.add(h);???????????????????????????????????????????????????????????????????????????????????
????nodeArray.add(h);???????????????????????????????????????????????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
?}???????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?/**?????????????????????????????????????????????????????????????????????????????????????????????????????????
? *? 將隊列array中的每個HFMNode對象按權值排序 ,????????????????????????????????????????????????????????????????????????????
? *? 取得最后兩個對象生成二叉樹,??????????????????????????????????????????????????????????????????????????????????????????
? *? 刪除這2個節點,添加其構成的父節點???????????????????????????????????????????????????????????????????????????????????????
? *? 且當array中只有一個元素時,該元素為根節點?????????????????????????????????????????????????????????????????????????????????
? */?????????????????????????????????????????????????????????????????????????????????????????????????????????
? public void sortAndConsTree() {??????????????????????????????????????????????????????????????????????????????
??while(array.size()>=2){//冒泡排序???????????????????????????????????????????????????????????????????????????
???for(int i=0;i<array.size();i++){????????????????????????????????????????????????????????????????????
????HFMNode tem = array.get(i) ;????????????????????????????????????????????????????????????????????
????for(int j=i+1;j<array.size();j++){??????????????????????????????????????????????????????????????
?????if(array.get(j).getWeight()>tem.getWeight()){???????????????????????????????????????????????
??????array.set(i, array.get(j));?????????????????????????????????????????????????????????????
??????array.set(j, tem);??????????????????????????????????????????????????????????????????????
??????tem = array.get(i);?????????????????????????????????????????????????????????????????????
?????}???????????????????????????????????????????????????????????????????????????????????????????
????}???????????????????????????????????????????????????????????????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????
???HFMNode parent = new HFMNode();?????????????????????????????????????????????????????????????????????
???int len = array.size();?????????????????????????????????????????????????????????????????????????????
???HFMNode last = array.get(len-1) ;???????????????????????????????????????????????????????????????????
???HFMNode lastSecond = array.get(len-2);??????????????????????????????????????????????????????????????
???parent.setLeftChild(last);??????????????????????????????????????????????????????????????????????????
???last.setParent(parent);?????????????????????????????????????????????????????????????????????????????
???parent.setRightChild(lastSecond);???????????????????????????????????????????????????????????????????
???lastSecond.setParent(parent);???????????????????????????????????????????????????????????????????????
???int? leftWeight =? last.getWeight() ;????????????????????????????????????????????????????????????????
???int? rightWeight = lastSecond.getWeight() ;?????????????????????????????????????????????????????????
???parent.setWeight(leftWeight + rightWeight);?????????????????????????????????????????????????????????
???array.remove(len-1);????????????????????????????????????????????????????????????????????????????????
???array.remove(len-2);????????????????????????????????????????????????????????????????????????????????
???array.add(parent);??????????????????????????????????????????????????????????????????????????????????
???nodeArray.add(parent);??????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
?}???????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?/**?????????????????????????????????????????????????????????????????????????????????????????????????????????
? * 打印每個字符的哈夫曼編碼?????????????????????????????????????????????????????????????????????????????????????????????
? * 從根節點開始,向左走一步編碼為1,向右為0????????????????????????????????????????????????????????????????????????????????????
? */?????????????????????????????????????????????????????????????????????????????????????????????????????????
? public void setEveryCharCode (HFMNode node){?????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????
??if(node.getLeftChild()!=null&&node.getRightChild()!=null){//判斷為葉節點??????????????????????????????????????
???node.getLeftChild().setCode(node.getCode() + 1);????????????????????????????????????????????????????
???node.getRightChild().setCode(node.getCode() + 0);???????????????????????????????????????????????????
???setEveryCharCode(node.getLeftChild());??????????????????????????????????????????????????????????????
???setEveryCharCode(node.getRightChild());?????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
?}???????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?/**?????????????????????????????????????????????????????????????????????????????????????????????????????????
? * 得到字符串的編碼?????????????????????????????????????????????????????????????????????????????????????????????????
? */?????????????????????????????????????????????????????????????????????????????????????????????????????????
? public String? getAllCode() {????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????
??//按權值順序打印所有葉節點的字符和編碼????????????????????????????????????????????????????????????????????????????????????
??for(int i=0;i<nodeArray.size();i++){????????????????????????????????????????????????????????????????????
???HFMNode tem = nodeArray.get(i);?????????????????????????????????????????????????????????????????????
???for(int j=i+1;j<nodeArray.size();j++){??????????????????????????????????????????????????????????????
????if(nodeArray.get(j).getWeight()>tem.getWeight()){???????????????????????????????????????????????
?????nodeArray.set(i, nodeArray.get(j));?????????????????????????????????????????????????????????
?????nodeArray.set(j, tem);??????????????????????????????????????????????????????????????????????
?????tem = nodeArray.get(i);?????????????????????????????????????????????????????????????????????
????}???????????????????????????????????????????????????????????????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
??//打印所有的字符的HFM編碼?????????????????????????????????????????????????????????????????????????????????????????
??System.out.println("******************以下是傳入字符串的權值和哈夫曼編碼");??????????? ???????????????????????????????????
??for(int j=0 ;j<nodeArray.size();j++){???????????????????????????????????????????????????????????????????
???HFMNode h = nodeArray.get(j);???????????????????????????????????????????????????????????????????????
???if(h.getChar()!='\u0000'){//char型變量的默認值為'\u0000'????????????????????????????????????????????????????
????System.out.println(h.getChar()+"的權值:"+h.getWeight()+"? 哈夫曼編碼:"+h.getCode());????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
??System.out.println("*******************以下是生成的哈夫曼樹的結構");?????? ???????????????????????????????????????????
??//打印生成HFM樹的結構???????????????????????????????????????????????????????????????????????????????????????????
??for(int k=0;k<nodeArray.size();k++){????????????????????????????????????????????????????????????????????
???HFMNode hfm = nodeArray.get(k);?????????????????????????????????????????????????????????????????????
???if(hfm.getParent()==null){??????????????????????????????????????????????????????????????????????????
????System.out.println("第"+k+"個節點為根節點,其權值為:"+hfm.getWeight());??????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
???else if(hfm.getLeftChild()==null&&hfm.getRightChild()==null){???????????????????????????????????????
????System.out.println("第"+k+"個節點為葉節點??? 字符為:"+hfm.getChar()+" 權值:"+hfm.getWeight()+"? 哈夫曼編碼為:"+hfm.getCode());
???}???????????????????????????????????????????????????????????????????????????????????????????????????
???else{???????????????????????????????????????????????????????????????????????????????????????????????
????System.out.println("第"+k+"個節點為中間節點,其權值為:"+hfm.getWeight());?????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????
??String allCode="" ;?????????????????????????????????????????????????????????????????????????????????????
??char[] c = data.toCharArray();??????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????
??for(int i=0;i<c.length;i++){????????????????????????????????????????????????????????????????????????????
???for(int j=0;j<nodeArray.size();j++){//nodeArray中儲存有所有的節點,包括根節點和中間節點?????????????????????????????????
????if(c[i]==nodeArray.get(j).getChar()){???????????????????????????????????????????????????????????
?????allCode+=nodeArray.get(j).getCode();????????????????????????????????????????????????????????
?????break ;?????????????????????????????????????????????????????????????????????????????????????
????}???????????????????????????????????????????????????????????????????????????????????????????????
???}???????????????????????????????????????????????????????????????????????????????????????????????????
??}???????????????????????????????????????????????????????????????????????????????????????????????????????
??return allCode ;????????????????????????????????????????????????????????????????????????????????????????
?}???????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????
?public ArrayList<HFMNode> getArray(){???????????????????????????????????????????????????????????????????????
??return this.array ;?????????????????????????????????????????????????????????????????????????????????????
?}????????????????????????????????????????????????????????????????????????????????????????????????????????????

}??????????????????????????????????????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? ? 測試類 ????

??? 測試描述 :??傳入一個字符串? String s = "abbcccddddeeeeeffffff"

????????????????????打印個字符的權值和哈夫曼編碼,以及生成哈夫曼樹的結構

package tree;

public class TestApp {
?public static void main(String[] args){
??String s = "abbcccddddeeeeeffffff" ;
??ConstructHFM? h = new ConstructHFM(s);
??h.getStringCode();
?}
}

測試結果

******************以下是傳入字符串的權值和哈夫曼編碼
f的權值:6? 哈夫曼編碼:01
e的權值:5? 哈夫曼編碼:10
d的權值:4? 哈夫曼編碼:11
c的權值:3? 哈夫曼編碼:000
b的權值:2? 哈夫曼編碼:0010
a的權值:1? 哈夫曼編碼:0011
*******************以下是生成的哈夫曼樹的結構
第0個節點為根節點,其權值為:21
第1個節點為中間節點,其權值為:12
第2個節點為中間節點,其權值為:9
第3個節點為中間節點,其權值為:6
第4個節點為葉節點??? 字符為:f 權值:6? 哈夫曼編碼為:01
第5個節點為葉節點??? 字符為:e 權值:5? 哈夫曼編碼為:10
第6個節點為葉節點??? 字符為:d 權值:4? 哈夫曼編碼為:11
第7個節點為葉節點??? 字符為:c 權值:3? 哈夫曼編碼為:000
第8個節點為中間節點,其權值為:3
第9個節點為葉節點??? 字符為:b 權值:2? 哈夫曼編碼為:0010
第10個節點為葉節點??? 字符為:a 權值:1? 哈夫曼編碼為:0011
*******************************************************
abbcccddddeeeeeffffff的哈夫曼編碼是:001100100010000000000111111111010101010010101010101

?

??

哈夫曼樹的建立


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久久依人综合影院 | 66精品综合久久久久久久 | 视频福利在线 | 国内精品久久久久影院一蜜桃 | 久草青草| 桃花阁成人网在线观看 | 香港aa三级久久三级不卡 | 综合精品 | 亚洲 欧美 日韩 在线 香蕉 | 4虎在线观看 | 亚洲色吧| 国产亚洲欧美ai在线看片 | 欧美 xx性 在线 | 天天操欧美 | 伊人国产精品 | 国产成人99久久亚洲综合精品 | www.久| 久久久久亚洲 | 国产免费久久精品 | 国产精品ⅴ视频免费观看 | 日狠狠| 99爱色| 久久久一区二区三区 | 亚洲视频在线免费播放 | 欧美日韩亚洲国产精品一区二区 | 免费观看国产网址你懂的 | 91尤物在线视频 | 91精品国产免费久久 | 不卡一二区| 蜜桃综合| 亚洲国产麻豆 | 久re这里只有精品最新地址 | 久久综合综合久久 | 天天操夜夜噜 | 另类色视频 | 99视频国产热精品视频 | 国产美女在线观看 | 久9视频这里只有精品8 | 在线免费一区二区 | 中文字幕日本一区波多野不卡 | 久久精品在线观看 |