自适应Huffman压缩码的生成(2)
2012-08-21 20:25
(三)交换当前结点与所属块的最大结点
当HighInBlock函数返回的不是 -1 就必须交换当前结点与所属块的最大结点,保证兄弟属性。
(四)对当前字符进行编码
从输入流中得到一个字符,若以前出现过该字符,则对该字符进行编码,并判断该字符是否是所属块的最大结点,否就交换当前结点与最大结点;若以前没有出现该字符,则生成两个结点,一个结点用于保存该字符,另一个用做逸出码结点NYT,并这两个结点的父结点为原逸出码结点NYT,输出逸出码及原字符。在这里我们用了code这个结构来保存一个字符的编码。
程序流程过程如下:
1、 从字符输入流中,取出一个字符;
2、 判断该字符以前是否出现过?
3、否,用新的NYT及字符结点代替原NYT,输出逸出码及原字符,并使原NYT及字符结点的权值赋为一,改变当前结点为原NYT结点;
4、是,输出该字符的编码,判断该字符是否是所属块的最大结点?否,交换该字符结点与最大结点,改变当前结点为最大结点,并是当前结点的权值加一。
(五)更新Huffman树结构
当从输入流中取出一个字符并对其编码后,Huffman树的权值发生了变化,这就要更新Huffman树,在程序实现上用了变量newplace 保存了需要更新结点权值的位置,当该结点不是根结点就递归是其父结点的权值加一。
程序流程如下:
1、 当前结点是否为根结点?是,结束;否,转2;
2、改变当前结点为其父结点;
3、判断该结点是所属块的最大结点?是,转4;否,交换当前结点与最大结点;
4、当前结点的权值加一,转1。
四、对输入字符流进行压缩
对字符进行压缩,实际上对字符编码和更新Huffman树的过程。
程序流程如下:
(一)初始化Huffman树;
(二)是否遇到结束符’\0’,否,转3;否则就结束;
(三) 对字符进行编码;
(四) 更新Huffman树;
(五)读下一个字符,转2。 void CAdaptiveHuffman::OnCompress()
{
//原文本编辑框的内容赋给sAdapOriginalText
GetDlgItemText(IDC_Adap_OriginalText,sAdapOriginalText);
char m_sAdapOriginalText[32767];
//sAdapOriginalText的内容赋给m_sAdapOriginalText
strcpy(m_sAdapOriginalText,(LPSTR)(LPCTSTR)sAdapOriginalText);
int C=0;
char ch;
ch=m_sAdapOriginalText[C];
adapstr.Format("");
InitHuffman();//初始化Huffman树
while(ch!=’\0’) //判断文本是否结束
{
Encode(ch);//对字符ch编码
UpdateTree();更新Huffman树
C++;
ch=m_sAdapOriginalText[C];
}
SetDlgItemText(IDC_Adap_CompressText,adapstr);//在二进制编辑框显示压缩流
Huffman_Information();
SetDlgItemText(IDC_Adap_Information,information);
CheckCompressButton=TRUE;//按下压缩按钮,把它赋为TRUE
CButton *pBtn;
//屏蔽压缩按钮
pBtn=(CButton*)GetDlgItem(IDC_Compress);
pBtn->EnableWindow(FALSE);
自适应Huffman压缩码的生成(2).doc
将本文的Word文档下载到电脑
下载失败或者文档不完整,请联系客服人员解决!