哈夫曼編碼 資料結構

2021-08-20 08:21:06 字數 2945 閱讀 8056

上週日做了資料結構實驗報告,感覺還行。

一、課題描述

二、概要設計(主要思想應根據**執行順序了解)

1)資料邏輯結構:主要是樹形結構,也有使用線性結構作為輔助;

儲存結構分析:主要是非線性結構(二叉樹)。

結點:struct hufftree;

2)本程式包含8個函式:

(1)將資料樹化函式hufftree* create(const char c, int i)

c為字元,i為權值,將其存入一棵最小的二叉樹中,左右兒子均為空,然後返回這棵二叉樹,配合init()函式使用。

(2)初始化函式void init():

接受輸入的字元及其權值,並將每一組字元和權值樹化,存入vector容器huff中。

(3)比較函式bool cmp(hufftree*h1,hufftree*h2)

比較兩個結點,如果前者權值小於後者,返回true,否則返回false,輔助sort函式使用。

(4)合併兩棵樹函式hufftree* merge(hufftree*t1, hufftree*t2)

建立乙個新結點,權值為t1和t2的權值之和,char資料為』#』,表示非輸入的字元,然後返回這個結點(樹)。

(5)(主要演算法實現)編碼函式hufftree* encode()

在容器huff裡面,只要不止一棵樹,就進行排序,將權值小的排在前面,按規則合併最小的兩棵樹(刪除原兩樹,將新樹插入),當還剩下一棵樹的時候,這棵樹就是哈夫曼樹,然後把這棵樹返回,用finaltree接收。

(6)得到編碼函式void huffvisit(hufftree*t, string s)

遍歷finaltree,以左為1,右為0,每碰到data為字母的子樹,就把當前的01字元和字母串存入容器huffdic中(以字母為key)

(7)解碼函式void decode(hufftree*t, string s)

依s中01字串以1左0右的規則遍歷finaltree,得到的每乙個字母均存入string decstr中,得到解碼字串decstr。

(8)檔案操作函式void file()

將huffdic和decstr中儲存的結果寫入檔案中。

(9)展示函式void show()

將測試結果列印出來

(10)主函式int main()

呼叫其他函式,完成功能。

三、**編寫(注:本**在visual studio 2017下編譯執行通過)

#include#include#include#include#include#includeusing namespace std;

struct hufftree //樹結點結構體

;typedef pairpair; //為了方便起見,現將前者簡化寫法

bool space=false;

hufftree* finaltree; //最終的哈夫曼樹

vectorhuffdic; //存放每個字元的哈夫曼編碼

vectorhuff; //存放開始的全部哈夫曼樹

string decodestr; //對01字串解碼後的字串

hufftree* createtree(const char c, int i) //將資料化為小樹

void initial()

cout << "是否輸入空格' '的權值?如果是,請輸入正整數;如果否,請輸入負數:"; //確認是否為空格編碼

cin >> t;

if (t >= 0)

}bool sortcmp(hufftree*h1, hufftree*h2) //sort的比較函式過載

hufftree* treemerge(hufftree*t1, hufftree*t2) //和並兩棵小樹,使兩棵小樹成為大樹的孩子

hufftree* getfinaltree()

while (huff.size() > 1) //huff內不止一棵樹的時候

return huff.front(); //返回最後剩餘的一棵樹,即finaltree

}void encode(hufftree*t, string s)

if (t->right) //如果有右子樹 }

void decode(hufftree*t, string s)

else }

void fileaction()

for (int i = 0; i < huffdic.size(); i++)

f << decodestr; //將decodestr寫入檔案

f.close();

cout << "結果已儲存至——'test.txt'!" << endl;

}void results()

cout << "請輸入欲編碼的字串:";

//cin >> test;

char c[100] = ;

getchar();

cin.getline(c, 100); //getline以輸入帶空格的字串

string test(c, c + 100);

int sym = 0;

for (string::iterator it = test.begin(); it != test.end(); it++)

//else

//} if (sym)

cout << "字串中有未編碼字元,編碼結果可能錯誤";

cout << endl << "請輸入欲解碼的01編碼:"<> test;

decode(finaltree, test); //輸入編碼,進行解碼

cout << decodestr << endl;

}int main()

哈夫曼編碼 資料結構 源程式

構造思想 哈夫曼樹 1 由給定的n個權值構造n棵樹只有乙個葉子結點的二叉樹,得到乙個二叉樹的合f 2 再f中選取根結點的權值最小和次小的二棵二叉樹作為左,右子樹構造一棵新的二叉樹,這棵樹的根結點的權值為左右子樹根結點權值之和。3 在集合f中刪除作為左右子樹的二棵二叉樹,並將新建的二叉樹加入到集合f中...

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...

哈夫曼編碼 哈夫曼樹 (資料結構)

哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...