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 傳乙個陣列進來 建立哈夫曼樹...