HuffmanTree,哈夫曼樹的原理和c 實現

2022-09-12 20:00:18 字數 2123 閱讀 1186

目錄哈夫曼樹又稱為最優樹.

通過權值來構造樹,權值越大,離根節點越近

經常用於無失真壓縮演算法

用於需要優化儲存空間的場景

原理很簡單,不多贅述

需要注意 構建哈夫曼樹不僅要值,還需要對應的權值

比如越常出現的,權值越大

通過權值來構造哈夫曼樹

我畫了幾個圖,具體過程如下

上面通過權值構建了哈夫曼樹,再將字元與權值對應起來

往左記作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 又稱最優二叉樹,是一類帶權路徑長度最短的樹,有著廣泛的應用。在討論哈夫曼樹之前首先需要弄清楚關於路徑和路徑長度的概念。樹中兩個結點之間的路徑由乙個結點到另一結點的分支構成。兩結點之間的路徑長度是路徑上分支的數目。樹的路徑長度是從根結點到...