1. 程式人生 > >java使用優先順序佇列實現哈夫曼編碼

java使用優先順序佇列實現哈夫曼編碼

思路:
  1. 構建小根堆
  2. 根據小根堆實現哈夫曼樹
  3. 根據哈夫曼樹對資料進行編碼
程式碼實現如下:
/**
 * @Author: DaleyZou
 * @Description: 使用java實現一個哈夫曼編碼的小程式
 * @Date: Created in 19:45 2018-9-27
 * @Modified By:
 */
public class HuffmanCode {
    private class Node implements Comparable<Node>{
        char ch; // 字元
        int freq; // 權值
        boolean
isLeaf; // 是否是葉子節點 Node left, right; // 父節點的左節點和右節點 // 初始化一個帶權值的葉子節點 public Node(char ch, int freq){ this.ch = ch; this.freq = freq; this.isLeaf = true; } // 構建一個節點,帶左右節點 public Node(Node left, Node right, int freq){ this
.left = left; this.right = right; this.freq = freq; this.isLeaf = false; } @Override public int compareTo(Node node) { return this.freq - node.freq; } } // 構建一顆哈夫曼樹 public Map<Character, String> encode(
Map<Character, Integer> frequencyForChar){ PriorityQueue<Node> priorityQueue = new PriorityQueue<>(); for (Character ch : frequencyForChar.keySet()){ priorityQueue.add(new Node(ch,frequencyForChar.get(ch))); } while (priorityQueue.size() != 1){ // 構建小根堆 Node left = priorityQueue.poll(); Node right = priorityQueue.poll(); priorityQueue.add(new Node(left, right, left.freq + right.freq)); } return encode(priorityQueue.poll()); } public Map<Character, String> encode(Node root){ HashMap<Character, String> hashMap = new HashMap<>(); encode(root, "", hashMap); return hashMap; } public void encode(Node root, String encoding, HashMap<Character,String> hashMap) { if (root.isLeaf){ // 已經到葉子節點,遞迴結束 hashMap.put(root.ch, encoding); return; } encode(root.left, encoding + "0" ,hashMap); // 編碼左節點 encode(root.right, encoding + "1", hashMap); // 編碼右節點 } // 測試結果是否正確 public static void main(String[] args){ Map<Character, Integer> frequencyForChar = new HashMap<>(); frequencyForChar.put('a', 10); frequencyForChar.put('b', 20); frequencyForChar.put('c', 40); frequencyForChar.put('d', 80); HuffmanCode huffmanCode = new HuffmanCode(); Map<Character, String> encode = huffmanCode.encode(frequencyForChar); for (Character ch : encode.keySet()){ System.out.println(ch + " : " + encode.get(ch)); } } }

相關推薦

java使用優先順序佇列實現編碼

思路: 構建小根堆 根據小根堆實現哈夫曼樹 根據哈夫曼樹對資料進行編碼 程式碼實現如下: /** * @Author: DaleyZou * @Description: 使用java實現一個哈夫

java使用優先級隊列實現編碼

哈夫曼編碼 左右 integer string enc ash 小根堆 rac sta 思路: 構建小根堆 根據小根堆實現哈夫曼樹 根據哈夫曼樹對數據進行編碼 代碼實現如下: /** * @Author: DaleyZou * @Description: 使用jav

Java如何實現編碼

哈夫曼樹 既然是學習哈夫曼編碼,我們首先需要知道什麼是哈夫曼樹:給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。   哈夫曼編碼

Java實現編碼和解碼

題目:將一個字串進行哈夫曼編碼;編碼過程中,會得到每個字元的編碼,通過已知的每個字元的編碼對之前的編碼進行解碼。 分析: 首先是哈夫曼編碼演算法,引用李澤年寫的《多媒體技術教程》中對哈夫曼編碼演算法的描述: •Initialization: Put all symbols

java實現編碼

哈夫曼演算法 眾所周知,哈夫曼演算法適用於檔案壓縮領域。由於上機需要,就寫了一個Java程式碼實現。 哈夫曼演算法的內容 1.將帶有符號的字母儲存為葉子節點,其權值為符號出現的次數 2.從這些葉子結點中找到權值最小的兩個節點,然後將其合併成一個新節點

優先佇列實現樹-先序遍歷&中序遍歷&後序遍歷

為使得哈夫曼樹唯一,我們通常規定左子樹的權值小於右子樹 import java.util.*; public class Build_huffman_tree { public static void main(String args[]){ Scanner in=new S

C++實現編碼--使用編碼樹壓縮和解壓縮

      壓縮就是位域的操作,假設A對應0000,B對應1111,則AB壓縮後為00001111即為0x0F,AB原本為2個位元組,壓縮後變為1個位元組。其它資料類似一樣的壓縮操作即可。       解壓縮就是取出每一個位,如果是0,則走到哈夫曼編碼樹的左孩子,如果是1,

用陣列實現編碼

昨天我們班了一場小型的c++資料結構考試,然後博主平時上課也算認真學了吧,但是課後卻沒有去及時鞏固,複習。有許多程式碼當時能敲出來,卻因為缺乏重複的練習,因此敲程式碼的速度特別慢,而且許多地方都有一些bug。導致昨天有個很簡單的huffman編碼的問題我都沒有解決。所以,今天

c語言實現編碼

#include <stdio.h>#include <math.h>#define MAX 100#define MAXSYMBS 30#define MAXNODE 59#define DEEP 10 typedef struct{ float w

C++實現編碼--構建編碼

     哈夫曼編碼分為動態和靜態之分。靜態哈夫曼編碼需要統計和計算每個欄位的權重(比如文字'A'字母出現的次數),效率會很低,特別是壓縮大檔案,基本是不現實的。只是,理解靜態哈夫曼編碼是基礎,理解壓縮和解壓思想。     本文使所使用的演算法和構建思路跟我們通常的資料結構

Java理解實現樹以其編碼解碼

哈夫曼樹以其編碼解碼 要求: 1.從終端讀入字符集大小為n(即字元的個數),逐一輸入n個字元和相應的n個權值(即字元出現的頻度),建立哈夫曼樹,進行編碼並且輸出。 將它存於檔案hfmtree中(選做)。 2.利用已建好的哈夫曼編碼檔案hfmtree,對鍵盤輸入的正文進行譯碼。輸出字元正文

貪心演算法--編碼java實現

package org.orithmetic.greedySelector; public class Node<T> implements Comparable<Node<T>>{          private T data;   

優先佇列實現及其在編碼中的應用

一.優先佇列的實現 template <class T> class priorityQueue { public: priorityQueue(); virtual ~priorityQueue(); v

編碼(Huffman coding)的那些事,(編碼技術介紹和程序實現)

信號 truct 依次 while 交換 需要 .text 示例 system 前言   哈夫曼編碼(Huffman coding)是一種可變長的前綴碼。哈夫曼編碼使用的算法是David A. Huffman還是在MIT的學生時提出的,並且在1952年發表了名為《

編碼解碼 C++實現

錯誤 urn using 過程 簡單 cin n) struct ren 哈夫曼編碼是一個通過哈夫曼樹進行的一種編碼,一般情況下,以字符:‘0’與‘1’表示。編碼的實現過程很簡單,只要實現哈夫曼樹,通過遍歷哈夫曼樹,這裏我們從每一個葉子結點開始向上遍歷,如果該結點為父節點的

轉載:樹的構造和編碼(C++代碼實現

作者 pos blank 字符 element start man null == 作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h>

資料結構————檔案壓縮(利用編碼實現

檔案壓縮原理: 首先檔案壓縮是通過HuffmaCode實現的、整體思路通過讀取檔案獲取字元出現頻率,通過字元出現頻率可以構建HuffmanTree,每個檔案中出現的字元通過HuffmanTree獲取HuffmanCode,從而將檔案中的字元同過HuffmanTree獲取相應編碼,並寫入壓

編碼實現(讀入檔案的形式)

#include<bits/stdc++.h> using namespace std; int w[30]; typedef struct { int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef

最小堆實現樹的構造及編碼、解碼

      以下程式的演算法思想主要來自於浙江大學陳越老師主編的資料結構一書。最大堆(最小堆思想差不多)(之後會寫一篇部落格介紹),這裡主要講講哈夫曼樹的定義及實現。 Huffman Tree 相關概念: 結點的路徑長度:從根結點到該結點的路徑上分支的數

編碼實現文字壓縮和解壓(C++)

哈弗曼樹:又稱最優二叉樹,是帶權路徑長度最短的樹。 哈夫曼編碼:是一種字首編碼,即同一字符集中任何一個字元的編碼都不是另外一個字元編碼的字首(最左子串)。         在哈弗曼樹中,若用‘0’表示左子樹,‘1’表示右子樹,那麼每當從根遍歷到一個葉子節點時都會形成一個0