bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

霍夫曼算法代碼java 編程實現(xiàn)霍夫曼編碼

求高手寫個關(guān)于哈夫曼編碼的算法

恩,樓主這個題目相當復(fù)雜啊

創(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è)合作伙伴!

首先讀文件,按字符讀。一個一個讀,統(tǒng)計所有出現(xiàn)字符的頻數(shù)。

記錄到一個鏈表里吧

第二步,建樹。霍夫曼樹……復(fù)雜程度可想而知。

Huffman 算法

思想: 權(quán)大的外結(jié)點靠近根, 權(quán)小的遠離根。

算法: 從m個權(quán)值中找出兩個最小值W1,W2構(gòu)成

w

w1 w2 W=W1+W2表通過該結(jié)點的頻度。

依次往上找……

估計你的100個字符的短文,出現(xiàn)的字符數(shù)量估計平均有20個左右,建的樹的高度就12就算低的。

3 按結(jié)點到跟的距離編碼,從左到右編碼為0 1 0 1依次進行……

生成霍夫曼編碼

把每個字幕的二進制編碼記錄,打出,這就是密碼表

然后對原來的文件進行打印,碰到相應(yīng)的字母打印出相應(yīng)的密碼(二進制啊,汗……)

估計只有拿到密碼才能看明白那一串的01!!

如果某一電文出現(xiàn)的字符為D={M,S,T,A,Q, K} , 每個字符出現(xiàn)的頻率為W={10,29,4,8,15,7},

則用改算法生成的密碼為:

S:0 A:100 M:101 Q:111

T:1100 K:1101

100 1100 101 0 111 0 1101 0 0 密文的含義是:

A T M S Q S K S S

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

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

代碼如下:

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;

}

}

JAVA和數(shù)據(jù)結(jié)構(gòu)大蝦們幫下忙: 輸入一段文字,該程序可以統(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é)點(中間臨時生成的節(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;

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

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 編程實現(xiàn)霍夫曼編碼
分享地址:http://vcdvsql.cn/article30/ddcedpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器服務(wù)器托管網(wǎng)頁設(shè)計公司搜索引擎優(yōu)化企業(yè)建站網(wǎng)站改版

廣告

聲明:本網(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)

成都seo排名網(wǎng)站優(yōu)化