Huffman编码示例代码

来源:互联网 发布:linux samba 用户权限 编辑:程序博客网 时间:2024/05/23 17:19
// Huffman编码示例代码struct HuffmanNode{int nFrequency; // 频率struct HuffmanNode* pParent; // 父节点struct HuffmanNode* pLeft; // 左节点struct HuffmanNode* pRight; // 右节点};// pData, 树数据,其中叶子数据已经准备好// nLen 数据 个数, pData需要2*nLen-1, 其中后面nLen-1个用于存储树中间节点// 返回后, 根节点是 &pData[2*nLen-2]void HuffmanTree(struct HuffmanNode* pData, int nLen){for(int pos = nLen; pos<2*nLen-1; ++pos){struct HuffmanNode* pMin1 = 0;struct HuffmanNode* pMin2 = 0;// 第一个最小值for(int i=0; i<pos; ++i){if(pData[i].pParent != 0){// 已经处理过了continue;}if(pMin1 == 0 || pMin1->nFrequency > pData[i].nFrequency){pMin1 = &pData[i];}}pMin1->pParent = &pData[pos];pData[pos].pLeft = pMin1; // 频率小在左枝// 第二个最小值for(int j=0; j<pos; ++j){if(pData[j].pParent != 0){// 已经处理过了continue;}if(pMin2 == 0 || pMin2->nFrequency > pData[j].nFrequency){pMin2 = &pData[j];}}pMin2->pParent = &pData[pos];pData[pos].pRight = pMin2;// 节点频率pData[pos].nFrequency = pMin1->nFrequency + pMin2->nFrequency;}}// 根据编码树获取编码// 返回: 编码位数和编码数字int GetHuffmanCode(struct HuffmanNode* pNode, int& code){code = 0;int nBits = 0;// 特殊处理if(pNode->pParent == 0){nBits = 1;return nBits;}struct HuffmanNode* pParent = pNode->pParent;while(pNode->pParent != 0){if(pNode == pNode->pParent->pLeft){// 左枝(频率小的一枝)编码为1 code |= (1<<nBits);}++nBits;pNode = pNode->pParent;}return nBits;}// 输出为二进制void printf2(int n, int bits){for(int i=bits-1; i>=0; --i){printf("%c", (n&(1<<i))?'1':'0');}}int main(){char ch[6] = {'A', 'B', 'C', 'D', 'E', 'F'};struct HuffmanNode tree[6+5] = {{12},{34},{23},{9},{10},{26},};HuffmanTree(tree, 6);// 输出编码for(int i=0; i<6; i++){int code;int bits = GetHuffmanCode(&tree[i], code);printf("%c [%d] : ", ch[i], tree[i].nFrequency);printf2(code, bits);printf("\n");}return 0;}/*输出:A [12] : 011B [34] : 00C [23] : 11D [9] : 0101E [10] : 0100F [26] : 10*/

0 0
原创粉丝点击