真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

霍夫曼編碼java代碼 霍夫曼編碼的程序流程圖

用java實現(xiàn)哈夫曼編碼

只要自己再加個類Tree就可以了。

創(chuàng)新互聯(lián)專注于旅順口網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供旅順口營銷型網(wǎng)站建設,旅順口網(wǎng)站制作、旅順口網(wǎng)頁設計、旅順口網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務,打造旅順口網(wǎng)絡公司原創(chuàng)品牌,更為您提供旅順口網(wǎng)站排名全網(wǎng)營銷落地服務。

代碼如下:

public class Tree {

double lChild, rChild, parent;

public Tree (double lChild, double rChild, double parent) {

this.lChild = lChild;

this.rChild = rChild;

this.parent = parent;

}

public double getLchild() {

return lChild;

}

public void setLchild(double lChild) {

this.lChild = lChild;

}

public double getRchild() {

return rChild;

}

public void setRchild(double rChild) {

this.rChild = rChild;

}

public double getParents() {

return parent;

}

public void setParents(double root) {

this.parent = root;

}

}

到底什么是哈夫曼樹啊,求例子

哈夫曼樹是給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

例子:

1、將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結點);

2、 在森林中選出兩個根結點的權值最小的樹合并,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

3、從森林中刪除選取的兩棵樹,并將新樹加入森林;

4、重復(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

擴展資料:

按照哈夫曼編碼構思程序流程:

1、切割的順序是從上往下,直至數(shù)組中的元素全部出現(xiàn)在葉節(jié)點;

2、我們思路正好相反,從數(shù)組中找出最小的兩個元素作為最下面的葉節(jié)點,在向備選數(shù)組中存入這兩個葉節(jié)點的和(這個新的和加入累加運算,這個和也就是所求的最小值的一部分,原因如上圖)。

3、以本題為例,備選數(shù)組中現(xiàn)有元素為{30,30},再次取出兩個最小元素進行求和,得到新的元素,回歸備選數(shù)組并記入累加。

4、上述2.3布重復執(zhí)行直至備選數(shù)組中只有一個元素,此時累加結束,返回累加值即可

5、求數(shù)組中的最小值,可以用小根堆進行提取最為方便;此題用到了貪心的思路,即用相同的策略重復執(zhí)行,直至我們得到所需的結果。

參考資料來源:百度百科——哈夫曼樹

JAVA和數(shù)據(jù)結構大蝦們幫下忙: 輸入一段文字,該程序可以統(tǒng)計出每個字符出現(xiàn)的次數(shù)并對字符進行哈夫曼編碼

寫給你了,請發(fā)JAVA版塊

package other;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

/**

* 定義了一種接口,要進行編碼的最小單元類必需實現(xiàn)些接口

*

*/

interface CombinableT extends ComparableT {

T combinate(T a, T b);

}

/**

*

* the huffman tree Class 哈夫曼樹,包括當前節(jié)點數(shù)據(jù)信息,左節(jié)點,右節(jié)點信息。

*/

class HuffmanTreeT extends CombinableT implements

ComparableHuffmanTreeT {

/** the root of huffman tree */

private T root;

/** the left node of huffman tree */

private HuffmanTreeT left;

/** the right node of huffman tree */

private HuffmanTreeT right;

/** 哈夫曼編碼字符串,如:0000110 */

private String huffmanCodeString = "";

/** 是否對最終生成的哈夫曼進行過編碼操作 */

private static boolean isSettedHuffmanCoderString = false;

public T getRoot() {

return root;

}

public void setRoot(T root) {

this.root = root;

}

public HuffmanTreeT getLeft() {

return left;

}

public void setLeft(HuffmanTreeT left) {

this.left = left;

}

public HuffmanTreeT getRight() {

return right;

}

public void setRight(HuffmanTreeT right) {

this.right = right;

}

/**

*

* 重寫此方法用于遞歸合并節(jié)點后進行排序操作

*

*/

public int compareTo(HuffmanTreeT o) {

return o.getRoot().compareTo(this.getRoot());

}

public String toString() {

return "the root:" + this.getRoot() + "\r\nthe left:" + this.getLeft()

+ "\r\nthe right:" + this.getRight();

}

/**

*

* 對最終生成的樹進行哈夫曼編碼,使每個葉子節(jié)點生成01的路徑編碼

*

*/

private void setHuffmanCoderString() {

HuffmanTreeT left = this.getLeft();

// 如果有左節(jié)點則在路徑中追加"0"

if (left != null) {

left.huffmanCodeString = this.huffmanCodeString + "0";

left.setHuffmanCoderString();// 遞歸編碼

}

HuffmanTreeT right = this.getRight();

// 如果有右節(jié)點則在路徑中追加"1"

if (right != null) {

right.huffmanCodeString = this.huffmanCodeString + "1";

right.setHuffmanCoderString();// 遞歸編碼

}

}

public void printHuffmanCoderString() {

// 打印最終生成樹的哈夫曼編碼前要進行編碼操作,

// 且此操作只執(zhí)行一次,所以用全局標識變量判斷

if (!HuffmanTree.isSettedHuffmanCoderString) {

this.setHuffmanCoderString();

HuffmanTree.isSettedHuffmanCoderString = true;// 標識已執(zhí)行過編碼

}

// 如果是葉子節(jié)點(即要編碼的單元),則打印出編碼信息,如果是非葉子結點(中間臨時生成的節(jié)點),則不打印

if (this.left == null this.right == null)

System.out.println("the " + this.getRoot() + " huffmanCoder:"

+ this.huffmanCodeString);

if (this.left != null)

this.left.printHuffmanCoderString();// 遞歸打印

if (this.right != null)

this.right.printHuffmanCoderString();// 遞歸打印

}

}

/**

*

* 用類用于生成一個哈夫曼樹

*/

class HuffmanTreeFactoryT extends CombinableT {

/** 初始時一個list列表當作要編碼的單元類的容器 */

private ListHuffmanTreeT HuffmanTreeCollection;

/**

*

* @param unitClasses

* 待編碼的單元類集合

*

*/

public HuffmanTreeFactory(ListT unitClasses) {

if (unitClasses == null || unitClasses.size() == 0)

throw new IllegalArgumentException(

"the unit classes collection can't be empty");

HuffmanTreeCollection = new LinkedListHuffmanTreeT();

// 初始化哈夫曼集合容器

for (T unitClass : unitClasses) {

HuffmanTreeT huffmanTree = new HuffmanTreeT();

huffmanTree.setRoot(unitClass);

huffmanTree.setLeft(null);

huffmanTree.setLeft(null);

HuffmanTreeCollection.add(huffmanTree);

}

Collections.sort(HuffmanTreeCollection);

}

/**

* 將待編碼的哈夫曼集合處理成只含有一個元素的集合,則這最后一個元素 即為最終生成的哈夫曼樹

*/

private void generateHuffmanTree() {

while (true) {

if (HuffmanTreeCollection == null

|| HuffmanTreeCollection.size() = 1)

break;

// 處理之前一定要重新排序,這是哈夫曼編碼的關鍵原理

Collections.sort(HuffmanTreeCollection);

HuffmanTreeT huffmanTreeOne = HuffmanTreeCollection.remove(0);

HuffmanTreeT huffmanTreeTwo = HuffmanTreeCollection.remove(0);

HuffmanTreeT huffmanTreeNew = new HuffmanTreeT();

// 將集合中前面兩個元素合并成一個元素插到集合中去

// 并將第一個元素和第二個元素分別作為新元素的左,右節(jié)點

huffmanTreeNew.setRoot(huffmanTreeOne.getRoot().combinate(

huffmanTreeOne.getRoot(), huffmanTreeTwo.getRoot()));

huffmanTreeNew.setLeft(huffmanTreeOne);

huffmanTreeNew.setRight(huffmanTreeTwo);

HuffmanTreeCollection.add(huffmanTreeNew);

}

}

/**

*

*

*

* @return 生成最終的哈夫曼樹

*

*/

public HuffmanTreeT getHuffmanTree() {

generateHuffmanTree();

return this.HuffmanTreeCollection.get(0);

}

}

/**

* 自定義一個用于測試的單元類

*/

class UnitClass implements Serializable, CombinableUnitClass {

/** 出現(xiàn)概率數(shù)據(jù) */

private int rate;

public UnitClass(int rate) {

this.rate = rate;

}

public int getRate() {

return rate;

}

public void setRate(int rate) {

this.rate = rate;

}

/**

* implements thid compartTo() in order to sort the

*

* collection stored from unitclass

*/

public int compareTo(UnitClass o) {

return o.getRate() this.rate ? 1 : o.getRate() this.rate ? -1 : 0;

}

public String toString() {

return "the rate is:" + rate;

}

/**

*

* 重寫此方法用于哈夫曼編碼時可以合并兩個分支點信息

*

*/

public UnitClass combinate(UnitClass a, UnitClass b) {

if (a == null || b == null)

return null;

return new UnitClass(a.getRate() + b.getRate());

}

}

public class Test {

public static int counter(String s, char c) {

int count = 0;

for (int i = 0; i s.length(); i++) {

if (s.charAt(i) == c) {

count++;

}

}

return count;

}

public static void main(String[] args) {

String str = "你好呵呵123abbeab啊";

ListUnitClass l = new ArrayListUnitClass();

for (int i = 0; i str.length(); i++) {

char c = str.charAt(i);

System.out.println(c + "出現(xiàn)了" + counter(str, c) + "次");

l.add(new UnitClass(c));

}

HuffmanTreeFactoryUnitClass factory = new HuffmanTreeFactoryUnitClass(

l);

factory.getHuffmanTree().printHuffmanCoderString();

}

}


文章名稱:霍夫曼編碼java代碼 霍夫曼編碼的程序流程圖
文章起源:http://weahome.cn/article/dddscps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部