1. 程式人生 > >Huffman編碼---java實現

Huffman編碼---java實現

演算法是準確的,目前程式還有一點點小bug

public class HTNode
{
	String name;                             // name of node
	int  weight;                               //weight
	int parent;                               //parent node
	int lchild;                               //leftchild node
	int rchild;                               //rightchild node	
	String Hcode;                              //huffman code
}


/**
 * this program is to show how HuffmanTree work.
 * to create huffmantree,and to huffmancode.
 * @author NEU 小宇
 * @version1.0
 */
public class Huffman 
{
	
	public HTNode[] ht;
	
	public static final int LEAF_NODE_NUM = 6;
	
	public Huffman()
	{
		ht = new HTNode[2*LEAF_NODE_NUM - 1];        //to initialize an array of nodes   
		for(int i = 0; i < 2*LEAF_NODE_NUM - 1; i++)
			ht[i] = new HTNode();
		ht[0].weight = 5;
		ht[1].weight = 8;
		ht[2].weight = 15;
		ht[3].weight = 30;
		ht[4].weight = 17;
		ht[5].weight = 27;
		ht[0].name = "a";
		ht[1].name = "b";
		ht[2].name = "c";
		ht[3].name = "d";
		ht[4].name = "e";
		ht[5].name = "f";
	}
	
	public void createHuffman()
	{
		int i, j, k, lnode, rnode;
		int min1, min2;
		
		for(i = 0; i < 2*LEAF_NODE_NUM - 1; i++)
			ht[i].parent = ht[i].lchild = ht[i].rchild = -1;
		for(i = LEAF_NODE_NUM; i < 2*LEAF_NODE_NUM - 1 ; i++)
		{
			min1 = min2 = 32767;
			lnode = rnode = -1;
			for(k = 0; k <= i - 1; k++){
				if(ht[k].parent == -1)
				{
					if(ht[k].weight < min1)
					{
						min2 = min1;
						rnode = lnode;
						min1 = ht[k].weight;
						lnode = k;
					}
					else if(ht[k].weight < min2)
					{
						min2 = ht[k].weight;
						rnode = k;
					}
				}
			}
				System.out.println(lnode+ "  " + rnode);
				ht[lnode].parent = i;
				ht[rnode].parent = i;
				ht[i].weight = ht[lnode].weight + ht[rnode].weight;
				ht[i].lchild = lnode;
				ht[i].rchild = rnode;
		}
	}
	void CreateHCode(HTNode[] ht)
	{
		for(int i = 0; i < LEAF_NODE_NUM; i++ )
		{
			int f = ht[i].parent;
			int c = i;
			while(f != -1)
			{
				if(ht[f].lchild == c)
					ht[i].Hcode = "0" + ht[i].Hcode;
				else
					ht[i].Hcode = "1" + ht[i].Hcode;
				c = f;
				f = ht[f].parent;
			}
		}
	}
}


import java.util.Scanner;

/**Input the sting, 
 * then you'll get the Huffman code
 * 
 * @author NEU 小宇
 * @version1.0
 */
public class GetHuffmanCode              
{
	public static void main(String[] args)
	{
		Huffman huffman = new Huffman();
		huffman.createHuffman();
		huffman.CreateHCode(huffman.ht);
		for(int i = 0; i < 6; i++)
			System.out.print(huffman.ht[i].Hcode + "   ");
		Input(huffman);
	}
	public static void Input(Huffman hf)
	{
		System.out.println("Input string(5 letters of a,b,c,d,e,f):");
		Scanner scanner = new Scanner(System.in);
		String inputStr = scanner.next();
		String subStr;
		for(int i = 0; i < 5; i++)
		{
			subStr = inputStr.substring(i, i + 1);
			if(subStr.equals("a"))
				System.out.print(hf.ht[0].Hcode);
			else if(subStr.equals("b"))
				System.out.print(hf.ht[1].Hcode);
			else if(subStr.equals("c"))
				System.out.print(hf.ht[2].Hcode);
			else if(subStr.equals("d"))
				System.out.print(hf.ht[3].Hcode);
			else if(subStr.equals("e"))
				System.out.print(hf.ht[4].Hcode);
			else if(subStr.equals("f"))
				System.out.print(hf.ht[5].Hcode);
		}
	}
}


相關推薦

Huffman編碼---java實現

演算法是準確的,目前程式還有一點點小bug public class HTNode { String name; // name of node int weight;

Huffman編碼實現

Huffman編碼的實現 哈夫曼編碼(Huffman Coding),又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼(VLC)的一種。Huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做Huffm

正規化Huffman編碼實現

傳統的Huffman 編碼依賴於二叉樹,一方面Huffman編碼生成的速度不夠快,另一方面在沒有指標的程式設計語言中要實現二叉樹結構又非常複雜。所以懂得構造正規化Huffman編碼去解決一些問題在某些方面就很有必要。正規化Huffman編碼相比與傳統Huffman編碼,不需要

JAVA實現Base64編碼的三種方式

ack ons static nts bstr clas [] ram trace 摘要: Javabase64編碼的三種方式 有如下三種方式: 方式一:commons-codec.jar Java代碼 1. String base64String="whuang12

Java實現將任何編碼方式的txt檔案以UTF-8編碼方式轉存

本文利用JDK中的BufferedReader和BufferedWriter實現將任何編碼方式的txt檔案以UTF-8編碼方式轉存。 UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼,由Ken Thompson於199

Unicode編碼和中文互轉(JAVA實現

//中文轉Unicode public static String gbEncoding(final String gbString) { //gbString = "測試" char[] utfBytes = gbString.toCharArray();

Python實現Huffman編碼

基於Huffman編碼的壓縮軟體的Python實現 個人分類: 演算法 Python 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/xanxus46/article/details/41359841 哈夫曼編碼是利用貪心演算法進行文字

貪心算法——Huffman 壓縮編碼實現

放置 分享圖片 但是 角度 相交 str 歧義 大於等於 即使 1. 如何理解 “貪心算法” 假設我們有一個可以容納 100 Kg 物品的背包,可以裝各種物品。我們有以下 5 種豆子,每種豆子的總量和總價值都各不相同。怎樣裝才能讓背包裏豆子的總價值最大呢? 這個問題其實很

Java實現視訊轉碼 mp4檔案轉編碼

相關jar 下載路徑 import java.io.File; import it.sauronsoftware.jave.AudioAttributes; import it.sauronsoftware.jave.Encoder; import it.sa

JAVA實現空間索引編碼(GeoHash)

個人部落格站已經上線了,網址 www.llwjy.com ~歡迎各位吐槽~ -------------------------------------------------------------------------------------------------

Huffman編碼實現壓縮、解壓檔案

Huffman編碼:根據詞頻構建Huffman樹,實現對文字的字首編碼。 1、統計文字中每個字元出現的次數,放入優先佇列中,構建一棵空的二叉樹; 2、取出頻率最小的兩個字元a、b,字元a、b的頻率分別作為此二叉樹的左右結點,左結點的編號為1,右結點的編號為0,其頻率之和(f

哈弗曼編碼java實現

import java.util.*; /** * Created by lipu on 17-6-28. */ class Node { Character c; int power; Node left = null;

利用DPCM&Huffman編碼實現資料壓縮_C語言實現

一、實驗原理        DPCM是差分預測編碼調製的縮寫,它利用過去的抽樣值來預測當前的抽樣值,對它們的差值進行編碼。差值編碼可以提高編碼頻率,這種技術已應用於模擬訊號的數字通訊之中。影象內的畫素值之間並非相互獨立,某一畫素與周圍畫素之間存在一定的關係,這一關係導致整

huffman編碼——原理與實現

那我們將friend bool operator >(Node node1,Node node2)修改為friend bool operator >(Node* node1,Node* node2),也就是傳遞的是Node的指標行不行呢? 答案是不可以,因為根據c++primer中過載操作

Eclipse下java專案的GBK編碼程式碼檔案轉換為UTF-8編碼實現程式碼

String srcDirPath = "D:\\work\\SVN\\Service";   String utf8DirPath = "D:\\work\\SVN\\Service2";          Collection<File> javaGbkFil

利用huffman編碼實現壓縮檔案

 哈夫曼是一種常用的壓縮方法。是1952年為文字檔案建立的,其基本原理是頻繁使用的資料用較短的程式碼代替,很少使用的資料用較長的程式碼代替,每個資料的程式碼各不相同。這些程式碼都是二進位制碼,且碼的長度是可變的。如: 有一個原始資料序列,ABACCDAA則編碼為A(0

Huffman編碼實現壓縮解壓縮

這是我們的課程中佈置的作業,找一些資料將作業完成,順便將其寫到部落格,以後看起來也方便。 原理介紹 什麼是Huffman壓縮 Huffman( 哈夫曼 ) 演算法在上世紀五十年代初提出來了,它是一種無失真壓縮方法,在壓縮過程中不會丟失資訊熵,而且可

Huffman編碼的C語言實現

實驗原理 Huffman 編碼 (1) Huffman Coding (霍夫曼編碼)是一種無失真編碼的編碼方式,Huffman 編碼是可變字長編碼(VLC)的一種。 (2)Huffman 編碼基於信源的概率統計模型,它的基本思路是,出現概率大的信源符號

java實現資料壓縮的哈夫曼(Huffman)演算法

package edu.princeton.cs.algs4; /** * The <tt>Huffman</tt> class provides static methods for compressing * and expanding

HuffmanTree的實現Huffman編碼

HuffTree的定義: 假設一共有n個data,第i個data有對應的權值wi。使從根節點到所有data的路徑長度乘以其權值和為最小。符合其條件的樹就是HuffmanTree,也被稱為最優二叉樹。 實現步驟: 先將n個data建成n個只有一個根節點的數