自适应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文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:数据仓库的商业智能

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: