⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman编码的8种实现方式.htm

📁 本程序使用8种不同的方式实现了Huffman编码算法
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            </DIV></DIV></DIV>
            <DIV class=menuitem><A 
            href="http://contextfree.net/wangyg/c/joseki/joseki.html">手机版围棋定式大辞典</A> 
            </DIV>
            <DIV class=menuitem><A 
            href="http://contextfree.net/wangyg/c/contest/contest.html">简单的Java并发测试工具</A> 
            </DIV>
            <DIV class=menuitem><A 
            href="http://contextfree.net/wangyg/c/wsCaller/wsCaller.html">Web 
            Service测试工具</A> </DIV>
            <DIV class=menuitem><A 
            href="http://contextfree.net/wangyg/c/stressmark/stressmark.html">StressMark压力测试工具</A> 
            </DIV>
            <DIV class=menuitem><A 
            href="http://contextfree.net/wangyg/c/codetool/codetool.html">CodeTool数制转换工具</A> 
            </DIV>
            <DIV class=menuitem><A 
            href="http://contextfree.net/wangyg/c/blueprint/blueprint.html">智能“蓝图”书画板</A> 
            </DIV></DIV></DIV><!--================= end Menu items ==================--></TD>
          <TD vAlign=bottom bgColor=#808080><IMG class=spacer height=10 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" width=10></TD>
          <TD bgColor=#808080><IMG class=spacer height=1 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" width=1></TD></TR>
        <TR>
          <TD class=bottom-left-thick colSpan=2 rowSpan=2></TD>
          <TD bgColor=#808080><IMG class=spacer height=10 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" width=10 border=0></TD>
          <TD class=bottom-right-thick colSpan=2 rowSpan=2></TD></TR>
        <TR>
          <TD bgColor=#808080 height=1><IMG class=spacer height=1 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" width=1></TD></TR>
        <TR>
          <TD height=5><IMG class=spacer height=5 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" 
    width=1></TD></TR></TBODY></TABLE></TD>
    <TD vAlign=top width="100%">
      <TABLE cellSpacing=0 cellPadding=0 width="100%" summary=content border=0><!--================= start Content==================-->
        <TBODY>
        <TR>
          <TD align=left width=10><IMG class=spacer height=1 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" width=10></TD>
          <TD align=left width="100%">
            <DIV class=content>
            <TABLE class=title>
              <TBODY>
              <TR>
                <TD vAlign=center>
                  <H1>Huffman编码的8种实现方式</H1></TD></TR></TBODY></TABLE><A 
            name=N1000C></A><A name=S01></A>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD width=9 height=10></TD>
                <TD>
                  <H3>简介</H3></TD>
                <TD style="FONT-SIZE: 70%" vAlign=bottom align=right>
                  <DIV style="MARGIN-BOTTOM: 3px"><A 
                  href="http://contextfree.net/wangyg/c/huffman/huffman.html#top"><IMG 
                  class=spacer height=15 alt="" 
                  src="Huffman编码的8种实现方式.files/totop.gif" width=15 
                  align=absMiddle> 返回页首 </A></DIV></TD></TR>
              <TR>
                <TD bgColor=#80c4ff colSpan=3><IMG class=spacer height=8 
                  alt="" src="Huffman编码的8种实现方式.files/spacer.gif" 
              width=1></TD></TR></TBODY></TABLE>
            <DIV class=section>
            <P>这里给出的源代码<A 
            href="http://contextfree.net/wangyg/c/huffman/huffman.zip">huffman.zip</A>用8种不同的方式实现了Huffman编码算法。这些代码意在演示不同Huffman算法的实现原理,比较算法执行效率的差别,但并没有针对实际应用环境的需求,做更多的空间或效率优化。所有代码以C++语言编写,为了更容易地实现各种数据结构,代码中大量应用了标准C++库和模板技术。——总之,这些代码的作用在于示例和演示;如果大家想把这些代码应用在实际应用中,可能还需要做进一步的调整和优化。</P>
            <P>我在2003年9月的《程序员》杂志上发表了<A 
            href="http://contextfree.net/wangyg/a/lbwb2/lbwb2_col.html">“奇妙的二叉树”</A>一文,对这8种算法进行了详细的讲解。这里,我只给出8种算法的概要描述。</P>
            <P>这8种实现方式分别是:</P>
            <UL>
              <LI>huffman_a:使用链表结构生成Huffman树的算法,这是最基本的实现方法,效率最低。 
              <LI>huffman_b:使用《数据结构》(严蔚敏,吴伟民,1997,C语言版)中给出的算法,将二叉树存放在连续空间里(静态链表),空间的每个结点内仍有左子树、右子树、双亲等指针。 

              <LI>huffman_c:使用Canonical 
              Huffman编码,同时对huffman_b的存储结构进行改造,将二叉树存放在连续空间tree里,空间的每个结点类型都和结点权值的数据类型相同,空间大小为2*num,tree[0]未用,tree[1..num]是每个元素的权值,生成Huffman后,tree[1..2*num-1]中是双亲结点索引。 

              <LI>huffman_d:在huffman_c的基础上,增加预先排序的功能先用QuickSort算法对所有元素的权值从小到大排序,这样,排序后最前面的两个元素就是最小的一对元素了。我们可以直接将它们挑出来,组合成一个子树。然后再子树的权值用折半插入法插到已排序的元素表中, 
              保证所有结点有序。为了保证初始元素的顺序不变,我们另外使用了一个索引数组,所有排序中的交换操作都是在索引数组中进行的。 
              <LI>huffman_e:在huffman_d的基础上,将索引数组放在tree的内部。为编码方便,将元素权值放在tree[num..2*num-1]处。将tree[0..num-1]作为索引数组。排序改为从大到小。对索引数组排序后,每次从最后选出2个最小值,相加后的结点权值放在索引数组最后,结点索引放在索引数组中倒数第2个位置,然后索引数组大小减1,并将最后一个索引值插入到前面的有序表中,保证索引数组仍然有序。 

              <LI>huffman_f:在huffman_e的基础上,将排序改为利用堆排序原理选择最小的两个权值。也即,将所有元素的权值组织成堆后,每次堆内的根结点就是最小值了。每取出一个根结点后,就把堆尾元素调到根结点重建堆。取出两个最小值合并成一个子树后,再把子树作为叶子结点放到堆中,并让其上升到合适的位置,保持堆性质不变。因为每次不必完成整个排序过程,而只是组织成堆,因此,这种方法要比使用快速排序更快。上述算法参考了mg-1.2.1中Huffman编码的实现,见<A 
              href="http://www.cs.mu.oz.au/mg/">http://www.cs.mu.oz.au/mg/</A> 
              <LI>huffman_g:当元素权值已经有序时,可以使用A. Moffat和J. 
              Katajainen设计的在权值数组内部构建Huffman的方法。A. Moffat和J. Katajainen对该算法的描述见<A 
              href="http://www.cs.mu.oz.au/~alistair/abstracts/inplace.html">http://www.cs.mu.oz.au/~alistair/abstracts/inplace.html</A> 

              <LI>huffman_h:在huffman_f的基础上,增加限制码长的功能。限制码长的算法参考了zlib-1.1.4中构造限制码长的Huffman编码的源代码。zlib的源代码见<A 
              href="http://www.gzip.org/zlib/">http://www.gzip.org/zlib/</A>,其中限制长度的算法在tree.c的gen_bitlen()函数中。 
              </LI></UL>
            <P>上述8种算法分别对应于8个同名C++类,这些类都是由huffman_base类派生的。huffman_base类提供了与Huffman算法相关的大多数通用功能,如编码转换、Canonical 
            Huffman编码生成、Huffman编码验证等等。</P>
            <P>main.cpp中的tester类提供了用随机数据测试上述8种算法,并显示算法的运行时间及运行结果的功能。</P></DIV><A 
            name=N1004D></A><A name=S02></A>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD width=9 height=10></TD>
                <TD>
                  <H3>编译和运行</H3></TD>
                <TD style="FONT-SIZE: 70%" vAlign=bottom align=right>
                  <DIV style="MARGIN-BOTTOM: 3px"><A 
                  href="http://contextfree.net/wangyg/c/huffman/huffman.html#top"><IMG 
                  class=spacer height=15 alt="" 
                  src="Huffman编码的8种实现方式.files/totop.gif" width=15 
                  align=absMiddle> 返回页首 </A></DIV></TD></TR>
              <TR>
                <TD bgColor=#80c4ff colSpan=3><IMG class=spacer height=8 
                  alt="" src="Huffman编码的8种实现方式.files/spacer.gif" 
              width=1></TD></TR></TBODY></TABLE>
            <DIV class=section>
            <P>Windows: 使用Visual Studio .NET(建议使用VS .NET 
            2003或以上版本)打开Huffman.sln,编译生成并运行huffman.exe即可。</P>
            <P>Linux: 系统中应已安装GNU gcc(建议安装gcc 
            3.2.2或以上版本)。本目录下的Makefile是Linux下的工程文件,直接在本目录下执行make命令即可生成可执行程序Huffman。</P></DIV><A 
            name=N10058></A><A name=S03></A>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD width=9 height=10></TD>
                <TD>
                  <H3>下载</H3></TD>
                <TD style="FONT-SIZE: 70%" vAlign=bottom align=right>
                  <DIV style="MARGIN-BOTTOM: 3px"><A 
                  href="http://contextfree.net/wangyg/c/huffman/huffman.html#top"><IMG 
                  class=spacer height=15 alt="" 
                  src="Huffman编码的8种实现方式.files/totop.gif" width=15 
                  align=absMiddle> 返回页首 </A></DIV></TD></TR>
              <TR>
                <TD bgColor=#80c4ff colSpan=3><IMG class=spacer height=8 
                  alt="" src="Huffman编码的8种实现方式.files/spacer.gif" 
              width=1></TD></TR></TBODY></TABLE>
            <DIV class=section>
            <P><A 
            href="http://contextfree.net/wangyg/c/huffman/huffman.zip">下载Huffman编码的8种实现方式(ZIP格式,39KB)</A> 
            </P></DIV>
            <P>[王咏刚,2003年7月]</P></DIV></TD>
          <TD width=10><IMG class=spacer height=1 alt="" 
            src="Huffman编码的8种实现方式.files/spacer.gif" width=10></TD></TR><!--================= end Content==================--></TBODY></TABLE></TD></TR>
  <TR>
    <TD><BR></TD>
    <TD><BR></TD></TR></TBODY></TABLE><!--================= end Menu, NavBar, Content ==================--><!--================= start Footer ==================-->
<TABLE cellSpacing=0 cellPadding=0 width="100%" summary=footer border=0>
  <TBODY>
  <TR>
    <TD style="FONT-SIZE: 70%" vAlign=bottom align=right>
      <DIV style="MARGIN-BOTTOM: 3px"><A 
      href="http://contextfree.net/wangyg/c/huffman/huffman.html#top"><IMG 
      class=spacer height=15 alt="" src="Huffman编码的8种实现方式.files/totop.gif" 
      width=15 align=absMiddle> 返回页首 </A><IMG class=spacer height=1 alt="" 
      src="Huffman编码的8种实现方式.files/spacer.gif" width=10></DIV></TD></TR>
  <TR>
    <TD width="100%" bgColor=#808080 height=1><IMG class=spacer height=1 
      alt="" src="Huffman编码的8种实现方式.files/spacer.gif" width=1></TD></TR>
  <TR>
    <TD class=copyright align=middle width="100%" bgColor=#f0f0f0><SPAN 
      class=footnote>Copyright&nbsp;© 2004&nbsp;王咏刚&nbsp; <EM>[本页面由 <A 
      href="http://forrest.apache.org/">Apache Forrest</A> 生成]</EM> <BR>欢迎来信: 
      <IMG class=spacer height=12 src="Huffman编码的8种实现方式.files/email.gif" 
      width=175 align=absMiddle border=0></SPAN></TD></TR>
  <TR>
    <TD><BR></TD></TR></TBODY></TABLE><!--================= end Footer ==================--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -