恩,樓主這個題目相當復(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
只要自己再加個類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;
}
}
寫給你了,請發(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)