成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

哈夫曼樹java代碼 哈夫曼樹csdn

哈夫曼樹編碼的應(yīng)用(Java語言)

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ù),完成本實驗的功能。

哈夫曼編碼與譯碼 java

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

}

`

/**

JAVA 哈夫曼樹權(quán)值求和(代碼找錯)

兄弟,你把如下第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);

}

}

我用java構(gòu)建哈夫曼樹的時候報了空指針,代碼如下

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)

商城網(wǎng)站建設(shè)
黑山县| 佛坪县| 小金县| 孟连| 宣汉县| 英山县| 普兰店市| 祁东县| 岗巴县| 兴文县| 西宁市| 宣威市| 北流市| 抚远县| 辽阳县| 合川市| 宜城市| 阳曲县| 腾冲县| 永丰县| 雅江县| 江安县| 镇雄县| 泸水县| 西丰县| 昆山市| 育儿| 天镇县| 盘锦市| 宕昌县| 麦盖提县| 贺兰县| 新丰县| 吉木萨尔县| 大埔区| 龙江县| 肥乡县| 嘉禾县| 伊宁市| 施秉县| 昌江|