1)編寫函數(shù)實現(xiàn)選擇parent為0且權(quán)值最小的兩個根結(jié)點的算法
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的勉縣網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
2)編寫函數(shù)實現(xiàn)統(tǒng)計字符串中字符的種類以及各類字符的個數(shù)。
3)編寫函數(shù)構(gòu)造赫夫曼樹。
4)編寫函數(shù)實現(xiàn)由赫夫曼樹求赫夫曼編碼表。
5)編寫函數(shù)實現(xiàn)將正文轉(zhuǎn)換為相應(yīng)的編碼文件。
6)編寫函數(shù)實現(xiàn)將編碼文件進(jìn)行譯碼。
7)編寫主控函數(shù),完成本實驗的功能。
class HaffmanNode //哈夫曼樹的結(jié)點類
{
int weight; //權(quán)值
int parent,left,right; //父母結(jié)點和左右孩子下標(biāo)
public HaffmanNode(int weight)
{
this.weight = weight;
this.parent=-1;
this.left=-1;
this.right=-1;
}
public HaffmanNode()
{
this(0);
}
public String toString()
{
return this.weight+", "+this.parent+", "+this.left+", "+this.right;
}
return code;
}
public static void main(String[] args)
{
int[] weight={5,29,7,8,14,23,3,11}; //指定權(quán)值集合
HaffmanTree htree = new HaffmanTree(weight);
System.out.println("哈夫曼樹的結(jié)點數(shù)組:\n"+htree.toString());
String[] code = htree.haffmanCode();
System.out.println("哈夫曼編碼:");
for (int i=0; icode.length; i++)
System.out.println(code[i]);
}
}
轉(zhuǎn)自:
哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹。所謂樹的帶權(quán)路徑長度,就是樹中所有的葉結(jié)點的權(quán)值乘上其到根結(jié)點的路徑長度(若根結(jié)點為0層,葉結(jié)點到根結(jié)點的路徑長度為葉結(jié)點的層數(shù))。樹的帶權(quán)路徑長度記為WPL=(W1 L1+W2 L2+W3 L3+...+ Wn Ln),N個權(quán)值Wi(i=1,2,...n)構(gòu)成一棵有N個葉結(jié)點的二叉樹,相應(yīng)的葉結(jié)點的路徑長度為Li(i=1,2,...n)??梢宰C明哈夫曼樹的WPL是最小的?!纠拷o定4個葉子結(jié)點a,b,c和d,分別帶權(quán)7,5,2和4。構(gòu)造如下圖所示的三棵二叉樹(還有許多棵),它們的帶權(quán)路徑長度分別為: (a)WPL=7 2+5 2+2 2+4 2=36 (b)WPL=7 3+5 3+2 1+4 2=46 (c)WPL=7 1+5 2+2 3+4 3=35其中(c)樹的WPL最小,可以驗證,它就是哈夫曼樹。
構(gòu)造哈夫曼樹的算法如下: 1)對給定的n個權(quán)值{W1,W2,W3,...,Wi,...,Wn}構(gòu)成n棵二叉樹的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉樹Ti中只有一個權(quán)值為Wi的根結(jié)點,它的左右子樹均為空。 2)在F中選取兩棵根結(jié)點權(quán)值最小的樹作為新構(gòu)造的二叉樹的左右子樹,新二叉樹的根結(jié)點的權(quán)值為其左右子樹的根結(jié)點的權(quán)值之和。 3)從F中刪除這兩棵樹,并把這棵新的二叉樹同樣以升序排列加入到集合F中。 4)重復(fù)2)和3),直到集合F中只有一棵二叉樹為止。 例如,對于4個權(quán)值為1、3、5、7的節(jié)點構(gòu)造一棵哈夫曼樹,其構(gòu)造過程如下圖所示:
可以計算得到該哈夫曼樹的路徑長度WPL=(1+3) 3+2 5+1*7=26。
哈夫曼編碼應(yīng)用 大數(shù)據(jù) 量的圖像信息會給存儲器的存儲容量,通信干線信道的帶寬,以及計算機的處理速度增加極大的壓力。單純靠增加存儲器容量,提高信道帶寬以及計算機的處理速度等方法來解決這個問題是不現(xiàn)實的,這時就要考慮壓縮。壓縮的關(guān)鍵在于編碼,如果在對數(shù)據(jù)進(jìn)行編碼時,對于常見的數(shù)據(jù),編碼器輸出較短的碼字;而對于少見的數(shù)據(jù)則用較長的碼字表示,就能夠?qū)崿F(xiàn)壓縮?!纠浚杭僭O(shè)一個文件中出現(xiàn)了8種符號S0,SQ,S2,S3,S4,S5,S6,S7,那么每種符號要編碼,至少需要3bit。假設(shè)編碼成 000,001, 010,011,100,101,110,111。那么符號序列S0S1S7S0S1S6S2S2S3S4S5S0S0S1編碼后變成 000001111000001110010010011100101000000001,共用了42bit。我們發(fā)現(xiàn)S0,S1,S2這3個符號出現(xiàn)的頻率比較大,其它符號出現(xiàn)的頻率比較小,我們采用這樣的編碼方案:S0到S7的碼遼分別01,11,101,0000,0001,0010,0011, 100,那么上述符號序列變成011110001110011101101000000010010010111,共用了39bit。盡管有些碼字如 S3,S4,S5,S6變長了(由3位變成4位),但使用頻繁的幾個碼字如S0,S1變短了,所以實現(xiàn)了壓縮。對于上述的編碼可能導(dǎo)致解碼出現(xiàn)非單值性:比如說,如果S0的碼字為01,S2的碼字為011,那么當(dāng)序列中出現(xiàn)011時,你不知道是S0的碼字后面跟了個1,還是完整的一個S2的碼字。因此,編碼必須保證較短的編碼決不能是較長編碼的前綴。符合這種要求的編碼稱之為前綴編碼。要構(gòu)造符合這樣的二進(jìn)制編碼體系,可以通過二叉樹來實現(xiàn)。以下是哈夫曼樹的 Java 實現(xiàn):
[java] view plain copy
// 二叉樹節(jié)點
public class Node implements Comparable { private int value; private Node leftChild; private Node rightChild; public Node(int value) { this.value = value; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Node getLeftChild() { return leftChild; } public void setLeftChild(Node leftChild) { this.leftChild = leftChild; } public Node getRightChild() { return rightChild; } public void setRightChild(Node rightChild) { this.rightChild = rightChild; } public int compareTo(Object o) { Node that = (Node) o; double result = this.value - that.value; return result 0 ? 1 : result == 0 ? 0 : -1; } }
private static Node build(ListNode nodes) {
nodes = new ArrayListNode(nodes);
sortList(nodes);
while (nodes.size() 1) {
createAndReplace(nodes);
}
return nodes.get(0);
}
/**
/**
private static void sortList(ListNode nodes) {
Collections.sort(nodes);
}
`
/**
兄弟,你把如下第28行的count++;注釋掉,一切問題都可以解決!
自己先琢磨為什么,不懂的再問!
import?java.util.Arrays;
import?java.util.Scanner;
public?class?a2?{
public?static?int?n,?count?=?0;
public?static?int?he[]?=?new?int[n?+?1];//?預(yù)定義權(quán)值數(shù)組
public?static?void?Huffman(int[]?a)?{
Arrays.sort(a);//?排序
//?System.out.println(a.length);
if?(a.length?==?1)//?如果長度是1結(jié)束遞歸
{
he[count++]?=?a[0];
return;
}
if?(a.length?==?2)//?如果長度是2結(jié)束遞歸
{
he[count++]?=?a[0]?+?a[1];
return;
}
else?//?長度大于2
{
int?b[]?=?new?int[a.length?-?1];//?定義一個新數(shù)組,用于保存a
he[count++]?=?a[0]?+?a[1];
b[0]?=?he[--count];//?新數(shù)組的第一個元素為當(dāng)前數(shù)組的最小的兩個數(shù)之和
for?(int?i?=?1;?i??b.length;?i++)
{
b[i]?=?a[i?+?1];//?賦值除第一個元素之外的值
}
//???count++;
Huffman(b);//?遞歸
}
}
public?static?void?main(String[]?args)?{
Scanner?sc?=?new?Scanner(System.in);
n?=?Integer.parseInt(sc.nextLine());
String?s[]?=?sc.nextLine().trim().split("?");//?輸入n個數(shù)
int?d[]?=?new?int[n];
for?(int?i?=?0;?i??n;?i++)
d[i]?=?Integer.parseInt(s[i]);//?將String轉(zhuǎn)化為int的數(shù)組
Huffman(d);//?遞歸調(diào)用
int?sum?=?0;
for?(int?i?=?0;?i??he.length;?i++)
sum?+=?he[i];//?求和
System.out.println(sum);
}
}
System.out.println("please input the second letter!");
char ch2 = tw.getChar();
if(ch2 == 'U') {System.out.println("Tuesday"); }
else if(ch2 == 'H') {System.out.println("Thursday"); }
分享名稱:哈夫曼樹java代碼 哈夫曼樹csdn
本文URL:http://jinyejixie.com/article26/dochpcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站策劃、網(wǎng)站排名、品牌網(wǎng)站制作、手機網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)