貪心演算法——Huffman編碼(哈夫曼編碼)
注:實現Huffman編碼是用貪心演算法來實現的,證明Huffman的貪心選擇和最優子結構很麻煩,我沒有看懂(演算法導論.中文版P234),這裡只是給出了實現Huffman編碼的實現程式碼。實現Huffman最好的資料結構時優先順序佇列(可以通過最小堆來實現)。整個演算法的時間複雜度可以達到nlg(n),這裡為了簡單,沒有實現最小堆,而使用的是STL中的set,通過實現正確的比較函式物件,每次可以取得優先順序(字元出現頻度最低)最大的值。但是這裡的時間複雜度卻提高了,因為操作set的選擇時,時間複雜度時lgn,但是隨著選擇的,選擇“未被訪問的最高優先順序的兩個元素(flag=0)”的探測次數也為增大,平均探測次數是n/2,因此最後實現Huffman的時間複雜度將是n^2lg(n)。當然也可以通過記錄每次選擇元素時其在set中的位置(偏移量),下次選擇時直接通過這個偏移量找到合適位置,探測的時間複雜度將會是1,最後實現Huffman的時間複雜度也可以達到nlog(n)。
n^2lg(n)的實現程式碼如下:
相關推薦
貪心演算法——Huffman編碼(哈夫曼編碼)
注:實現Huffman編碼是用貪心演算法來實現的,證明Huffman的貪心選擇和最優子結構很麻煩,我沒有看懂(演算法導論.中文版P234),這裡只是給出了實現Huffman編碼的實現程式碼。實現Huffman最好的資料結構時優先順序佇列(可以通過最小堆來實現)。整個演算法的時
字元編碼(哈夫曼編碼)
Question 請設計一個演算法,給一個字串進行二進位制編碼,使得編碼後字串的長度最短。 Algorithm 哈夫曼編碼,權為各個字元出現的頻率,再借助小根堆計算。 result=詞頻1*
HDU 1053 Entropy(哈夫曼編碼 貪心+優先隊列)
req else archive there format printf mod imp phi 傳送門: http://acm.hdu.edu.cn/showproblem.php?pid=1053 Entropy Time Limit: 2000/1000 MS (Ja
哈夫曼(Huffman)樹和哈夫曼編碼
選擇 其中 有一個 只有一個 bsp nbsp 例子 left style 一、哈夫曼(Huffman)樹和哈夫曼編碼 1.哈夫曼樹(Huffman)又稱最優二叉樹,是一類帶權路徑長度最短的樹, 常用於信息檢測。 定義: 結點間的路徑長度:樹中一個結點到另一個結點之間分
sgu-203 Hyperhuffman(哈夫曼編碼)
move include node ins time expect 一個 set tween Hyperhuffman You might have heard about Huffman encoding - that is the coding system that
小專案-檔案壓縮(哈夫曼樹)
先回顧一下哈夫曼樹 huffman樹即最優二叉樹,是加權路徑長度最短的二叉樹。哈夫曼樹的樹使用貪心演算法。 每次選擇該集合中權值最小的兩個作為葉子結點,父親節點的權值為葉子節點權值之和。然後又將其父親重新放進此集合裡。重複前面的做法,直到完成哈夫曼樹的建
C++實現哈夫曼編碼--使用哈夫曼編碼樹壓縮和解壓縮
壓縮就是位域的操作,假設A對應0000,B對應1111,則AB壓縮後為00001111即為0x0F,AB原本為2個位元組,壓縮後變為1個位元組。其它資料類似一樣的壓縮操作即可。 解壓縮就是取出每一個位,如果是0,則走到哈夫曼編碼樹的左孩子,如果是1,
ZOJ 1117 Entropy(哈夫曼樹)
Entropy Time Limit: 2 Seconds Memory Limit: 65536 KB Background An entropy encoder is a data encoding method that achieves lossles
最優二叉樹(哈夫曼樹)知識點
路徑:在一棵樹中從一個結點往下到孩子或孫子結點之間的通路 結點的路徑長度:從根節點到該節點的路徑上分支的數目 樹的路徑長度:樹中每個結點的路徑長度之和 結點的權:給樹中的結點賦予一個某種含義的值,則該
美團——股票交易日、二維陣列列印、奇數位丟棄、字元編碼(哈弗曼編碼)
股票交易日和二維陣列列印這兩道題就是time to sell stock和蛇形矩陣。 題目奇數位丟棄:(關於LinkedList和listIterator的使用) 對於一個由0..n的所有數按升序組成的序列,我們要進行一些篩選,每次我們取當前所有數字中從小到大的第奇
hdu1053 Entropy(哈夫曼樹)
複習了一天哈夫曼樹。。。 去年只是學了哈夫曼的構建,但不懂這樹的含義,今天想了好久,真的好厲害一棵樹啊! 一個普通的字串,竟然可以轉變為帶權值的樹。我許久不能理解的是為什麼字元出現次數可以用權值來表達
Entropy (哈夫曼樹)
題目連結 思路 程式碼 思路 純資料結構。 程式碼 #include <iostream> #include <cstdio> #include &l
C++實現哈夫曼編碼--構建哈夫曼編碼樹
哈夫曼編碼分為動態和靜態之分。靜態哈夫曼編碼需要統計和計算每個欄位的權重(比如文字'A'字母出現的次數),效率會很低,特別是壓縮大檔案,基本是不現實的。只是,理解靜態哈夫曼編碼是基礎,理解壓縮和解壓思想。 本文使所使用的演算法和構建思路跟我們通常的資料結構
資料結構與演算法 (七) 哈夫曼樹(Huffman)與哈夫曼編碼
1.演算法思想 哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的路徑長度是從樹根到每
貪心演算法_哈夫曼編碼問題(Huffman Coding)
問題分析:我們知道檔案的儲存都是以二進位制數表示的,如:字元c可以表示為010101...之類的。因為不同的作業系統對於不同的資料型別會分配給相同的資料容器長度,如java中int型資料固定佔用4個位元組的儲存空間。現在問題時因為各個字元出現的概率不同,那麼我們就可以給出現概率高的字元分配以"短"
貪心演算法之哈夫曼編碼(C語言實現)
如題 問題描述:現有一個文字檔案,其中包含的字元資料出現的次數各不相同,先要求對該文字中包含的字元進行編碼,使文字佔用的位數更小。 問題分析 我們知道檔案的儲存都是以二進位制數表示的,如:字元c可以表示為010101…之類的。因 為不同的作業
貪心演算法--哈夫曼編碼(java實現 )
package org.orithmetic.greedySelector; public class Node<T> implements Comparable<Node<T>>{ private T data;
#資料結構與演算法學習筆記#PTA17:哈夫曼樹與哈夫曼編碼 Huffman Tree & Huffman Code(C/C++)
2018.5.16 最近一段時間忙於實驗室各種專案和輔導員的各種雜活,間隔了半周沒有耐下心學習。導師最近接了一個要PK京東方的專案讓我來做總負責,確實是很驚喜了。責任心告訴我不能把工作做水了,但是還是嘗試把實權移交給師兄們比較好。 這道題可以說是樹這塊的壓軸題了,無論是程
Huffman(哈夫曼)樹編碼與解碼程式(全)
關於Huffman樹構建與編碼的原理,很多書上有介紹,我在這裡就只給出相應的程式,包括樹的構建,2種編碼方法,譯碼(這部分是我自己獨立寫的,肯定有不當之處,歡迎回帖指正)等,裡面註釋也很清晰,費了很大勁,希望對大家有幫助。 <span style="font-siz
Matlab 影象處理-哈夫曼編碼(huffman)
哈夫曼編碼是一種可變長無損編碼,應用範圍廣。這裡介紹利用matalb實現哈夫曼編碼方法。matalb中帶有相關函,下面一一介紹: ENCO = huffmanenco(SIG, DICT) : 哈夫曼