哈夫曼編碼 Huffman

2021-07-05 15:28:03 字數 1838 閱讀 6886

huffman編碼流程

資料壓縮流程

1、  讀取輸入

2、  將輸入中的每個char值得出現頻率製成**

3、  根據頻率構造huffman編碼樹

4、  構造編譯表,將輸入中的每個char值和乙個位元字串相關聯

5、  將單詞查詢樹編碼為位元字串並寫入輸出流

6、  將單詞總數編碼為位元字串並寫入輸出流

7、  使用編譯表翻譯每個輸入字元

/**

huffman實際上會生成二進位製流,這裡把輸入字串翻譯為二進位制的字串,比如"aab"翻譯為「001」,'a'為'0',『b』為'1'

這樣使用輸出時更以觀察生成的結果

*/#include #include #include #include #include using namespace std;

struct huffnode

~huffnode() };

class hufftree

hufftree(const string &str) : rawstr(str), root(null), freqvec(n)

~hufftree();

void printcodingvec();

void setbinstr();

void printbinstr();

void printrawstr()

private:

static const size_t n = 256;

string rawstr;

string binstr;

huffnode *root; // huffman tree

vector> freqvec;

vector> codingvec;

void init();

void makefreqvec();

void maketree();

void makecodingvec(huffnode *root);

};int main(void)

hufftree::~hufftree()

void hufftree::printcodingvec()

}void hufftree::setbinstr() }}

void hufftree::printbinstr()

template struct greator

};void hufftree::init()

void hufftree::makefreqvec()

}void hufftree::maketree()

} make_heap(treevec.begin(), treevec.end(), greator());

size_t length = treevec.size();

for (size_t i = 0; i < length - 1; i++)

root = treevec.front();

}void hufftree::makecodingvec(huffnode *pnode)

cvec.push_back('0');

makecodingvec(pnode->left);

cvec.pop_back();

cvec.push_back('1');

makecodingvec(pnode->right);

cvec.pop_back();

}

參考:

1、《演算法 第4版》5.5 資料壓縮

2、algorithm_data_structure

哈夫曼(Huffman)樹構造和哈夫曼編碼

n個權值,則構造出的哈夫曼樹有 n個葉子結點。n個權值分別設為 w1,w2,wn,則哈夫曼樹的構造規則為 1 根據給定的 n個權值構成n 棵二叉樹的集合 f 2 每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼...

哈夫曼(Huffman)編碼與解碼

利用哈夫曼編碼進行資訊通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳輸資料預先編碼,在接收端將傳來的資料進行解碼。對於雙工通道,每端都需要乙個完整的編碼 解碼系統。試為這樣的資訊收發站寫乙個哈夫曼的編 解碼系統。乙個完整的系統具有以下幾種操作 ...

哈夫曼樹(huffman)

學完了huffman樹,講一下自己對它的理解 圖二public class huffmantree override public int compareto nonnull treenodeo else if this.weight o.weight return 0 傳乙個陣列進來 建立哈夫曼樹...