最近完成乙個資料結構的作業,哈夫曼編碼,實現了
1.檢視字母的哈夫曼碼
2.哈夫曼碼轉文字
3.文字轉哈夫曼碼
這幾個功能
哈夫曼碼主要用於壓縮編碼,將字元用二進位制(0,1)編碼代替,能過使出現概率大的字母的二進位製碼短,而我們會根據字元的出現概率給各個字元賦乙個「權重」,再根據權重構造乙個二叉樹
核心便是如何構造這個哈夫曼二叉樹
那麼二叉樹的結點結構要有4個元素weight(權重),left(左孩子),right(右孩子),parent(雙親結點)
首先假設我們有乙個集合{2,4,5,3}即4個權重
1.選取兩個最小的權重(2,3)構成二叉樹最底部的葉子,它們的和是他們的parent
集合也就成了 {4,5,5}
2.重複第一步在4 ,5 ,5中選取兩個較小的(優先選取還未在樹上的4,5),集合變為{9,5}
3,重複以上二叉樹也就成了
talk is cheap,show you the code //我的環境是vs2013
// 哈夫曼.cpp : 定義控制台應用程式的入口點。
//#include "fstream"
#include "iostream"
#include "string"
#define max 53
using namespace std;
double w[1000];
string low = "0";
string high = "1";
string code[1000];
class huffman_tree
private:
huffman_tree *left;
huffman_tree *right;
double weight;
int parent;
};void huffman_tree::choose(huffman_tree *h, int n, int &num_1, int &num_2) //給哈夫曼樹各個葉子結點選擇權重
} for (i = j; i < n; i++) }
for (int i = j; i < n; i++)
else if (h[i].weight < m2)
} }}
huffman_tree* huffman_tree::build_tree(huffman_tree* &h, double *number, int n) //構造哈夫曼樹
return &h[m - 1];
}void coding(huffman_tree *t, string code, int n) //給各個字母編碼
}coding(t->left, code, n);
code = temp;
code = code + high;
coding(t->right, code, n); }}
bool read_file() //從檔案中讀取各個字母的概率
if ((int)weight != 1)
else
return 1;
}void de_code(huffman_tree *t,string code,int &n) //哈夫曼碼轉文字的遞迴演算法,直接遞迴遍歷哈夫曼樹
}} else
else
} }}
void show_word(huffman_tree *root) // 哈夫曼轉文字遞迴演算法的呼叫程式
} if (temp == 2)
else if (i < 91)
else
n++; }}
void caidan() //由於是課程設計的作業,得有個給老師看的介面
int main()
system("pause");
} } return 0;
}
當然這個**寫得很渣,有一種c語言風格的c++,之後肯定會慢慢地改正過來
Java實現哈夫曼二叉樹
1 統計學生學分 學生考試結果 a b c d 學分增加 5 4 3 0 人數 10 50 30 10 1 if a 5 else if b 4 else if c 3 else d 0 這份 執行的效率為 10 50 2 30 3 10 3 2 if b 4 else if c 3 else if...
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...
二叉樹與哈夫曼樹
1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...