目錄哈夫曼樹又稱為最優樹.
通過權值來構造樹,權值越大,離根節點越近
經常用於無失真壓縮演算法
用於需要優化儲存空間的場景
原理很簡單,不多贅述
需要注意 構建哈夫曼樹不僅要值,還需要對應的權值
比如越常出現的,權值越大
通過權值來構造哈夫曼樹
我畫了幾個圖,具體過程如下
上面通過權值構建了哈夫曼樹,再將字元與權值對應起來
往左記作0 往右記作1
從根節點到各個葉子節點經過的0和1
就是該節點對應的路徑
aaabbeaf編碼:01010110101110011111
01010110101110011111解碼:aaabbeaf
比如乙個字元a原來佔8位,通過哈夫曼編碼後,就只占用2個位
但缺點是 權值較低的 占用位元組會比較高,比如e,就占用4個位
下面**只是例子,編碼解碼並沒有真的用位來表示,而是用字串代替
huffmantree.h
#pragma once
#include#include#include#includeusing namespace std;
class huffmantree;
//僅用於優先順序佇列比較
struct nodecmp
};private:
node* root = nullptr;
vector*>map;
public:
huffmantree(vector& weight, vector& value)
//初始化節點
void createhuffmantreenode(vector& weight, vector& value) ;
que.push(temp);
} while (que.size() >= 2);
que.push(node);
} root = que.top();
} //初始化路徑
void createhuffmantreepath()
if (temp->right != nullptr)
if (temp->left == nullptr && temp->right == nullptr)
} }string encode(string data)
}} return result;
} string decode(string data)
}} return result;
}};
main.cpp
#include#include#includehuffmantree.h
int main()
; vectorvalue = ;
huffmantree tree(weight,value);
string str;
str = tree.encode(aaabbeaf);
cout << str << endl;
str = tree.decode(str);
cout << str << endl;
return 0;
}
哈夫曼樹 Huffman Tree
最優二叉樹 指帶權路徑長度最短的樹 class heapnode def init self,char none weight none left none right none self.char char self.weight weight self.left left self.right ...
樹 哈夫曼樹(Huffman Tree)
哈夫曼樹 樹的帶權路徑長度達到最小。1.將w1 w2 wn看成是有n 棵樹的森林 每棵樹僅有乙個結點 2.在森林中選出根結點的權值最小的兩棵樹進行合併,作為一棵新樹的左 右子樹,且新樹的根結點權值為其左 右子樹根結點權值之和 3.從森林中刪除選取的兩棵樹,並將新樹加入森林 4.重複 02 03 步,...
哈夫曼樹 Huffman tree 原理
source 1.哈夫曼樹的基本概念 哈夫曼樹 huffman 又稱最優二叉樹,是一類帶權路徑長度最短的樹,有著廣泛的應用。在討論哈夫曼樹之前首先需要弄清楚關於路徑和路徑長度的概念。樹中兩個結點之間的路徑由乙個結點到另一結點的分支構成。兩結點之間的路徑長度是路徑上分支的數目。樹的路徑長度是從根結點到...