假設一共有n個data,第i個data有對應的權值wi。使從根節點到所有data的路徑長度乘以其權值和為最小。符合其條件的樹就是huffmantree,也被稱為最優二叉樹。
先將n個data建成n個只有乙個根節點的數
然後從n個中找出兩個最小的data
將這兩個數合併為乙個二叉樹,左孩子為最小值,右孩子為第二小值
將這個樹的根節點的權值設為原來兩個點的權值之和
在剩下的n-1個根節點中執行步驟2直到只剩下乙個根節點,結束迴圈。
下面來講一下huffmantree的乙個最經典的應用,huffman編碼。
#include
#include
#include
#include
using
namespace
std;
const
int maxn=100;
typedef
struct hafnode;//huffmantree的基本定義
typedef
struct hafcode;
void init(hafcode *h,int &n)//初始化輸入資料
void select(hafnode *h,int k,int &s1,int &s2)//選擇兩個最小的值
s2 = i;
for(i=0; iif(h[i].parent==0 && i!=s1 && h[i].weightvoid huffman(hafcode *h2,hafnode *h1,int n)
int s1,s2;
for(int i=n;i//建立二叉樹
h1[s2].parent=i;
h1[i].lchild=s1;
h1[i].rchild=s2;
h1[i].weight=h1[s1].weight+h1[s2].weight;
//cout<}
str[n]='\0';
//memset(str,0,sizeof(str));
int l,p;
for(int i=0;i//從每個葉子節點開始倒序遍歷
l=n-1;//倒序賦值字串
//cout//cout}
}int main()
HuffmanTree,哈夫曼樹的原理和c 實現
目錄哈夫曼樹又稱為最優樹.通過權值來構造樹,權值越大,離根節點越近 經常用於無失真壓縮演算法 用於需要優化儲存空間的場景 原理很簡單,不多贅述 需要注意 構建哈夫曼樹不僅要值,還需要對應的權值 比如越常出現的,權值越大 通過權值來構造哈夫曼樹 我畫了幾個圖,具體過程如下 上面通過權值構建了哈夫曼樹,...
方法的宣告及實現
import inte ce car nsobject int comparewithspeed car m end implementation car int comparewithspeed car m end int main 方法的定義以及使用。注意方法的呼叫用物件呼叫,其中的變數也是方法...
棧的實現及應用
1.棧定義 棧又稱堆疊,是一種運算受限的線性表,限制是僅僅允許在表的另外一端進行插入和刪除運算。2.特點 後進先出 cpu快取利用率相對較高 不允許隨意訪問 3.實現方式 棧有兩種實現方式,一種是順序儲存,和陣列類似。一種是鏈式儲存,和單鏈表類似。這是在2013編譯器下 棧裡面有以下幾種函式 voi...