WQSCID

所属分类:数据结构
开发工具:C++
文件大小:23KB
下载次数:0
上传日期:2018-09-06 14:03:27
上 传 者6216539
说明:  Efficient huffman codec, efficient oh

文件列表:
huffman_a.h (722, 2003-07-19)
huffman_b.h (673, 2003-07-19)
huffman_base.h (2431, 2003-07-19)
huffman_c.h (702, 2003-07-27)
huffman_d.h (1055, 2003-07-27)
huffman_e.h (1057, 2003-07-19)
huffman_f.h (730, 2003-07-19)
huffman_g.h (565, 2003-07-19)
huffman_h.h (936, 2003-07-19)
huffman_b.cpp (1512, 2003-07-19)
huffman_base.cpp (3905, 2003-07-19)
huffman_c.cpp (1704, 2003-07-19)
huffman_d.cpp (2452, 2003-07-19)
huffman_e.cpp (2198, 2003-07-19)
huffman_f.cpp (4122, 2003-07-19)
huffman_g.cpp (5014, 2003-07-19)
huffman_h.cpp (6208, 2003-07-19)
ihuffman_a.cpp (1953, 2003-07-19)
main.cpp (3239, 2003-07-27)
Makefile (600, 2003-07-19)
wgCHuffman.ncb (101376, 2003-07-27)
v2Huffman.sln (903, 2003-07-14)
W5cHuffman.suo (8192, 2003-07-27)
85huffman.vcproj (4532, 2003-07-27)

---------------------- Huffman 算法的不同实现 ---------------------- 王咏刚,2003年7月。 本目录下的源代码均属示例、教学性质。作者不对这些代码的功能和性能作任何担保或承诺。 -------- 功能说明 -------- 本目录下的程序用8种不同的方式实现了Huffman编码算法,这8种方式分别是 * huffman_a 使用链表结构生成Huffman树的算法,这是最基本的实现方法,效率最低。 * huffman_b 使用《数据结构》(严蔚敏,吴伟民,1997,C语言版)中给出的算法,将二叉树存放在连续空间里(静态链表),空间的每个结点内仍有左子树、右子树、双亲等指针。 * huffman_c 使用Canonical Huffman编码,同时对huffman_b的存储结构进行改造,将二叉树存放在连续空间tree里,空间的每个结点类型都和结点权值的数据类型相同,空间大小为2*num,tree[0]未用,tree[1..num]是每个元素的权值,生成Huffman后,tree[1..2*num-1]中是双亲结点索引。 * huffman_d 在huffman_c的基础上,增加预先排序的功能先用QuickSort算法对所有元素的权值从小到大排序,这样,排序后最前面的两个元素就是最小的一对元素了。我们可以直接将它们挑出来,组合成一个子树。然后再子树的权值用折半插入法插到已排序的元素表中, 保证所有结点有序。为了保证初始元素的顺序不变,我们另外使用了一个索引数组,所有排序中的交换操作都是在索引数组中进行的。 * huffman_e 在huffman_d的基础上,将索引数组放在tree的内部。为编码方便,将元素权值放在tree[num..2*num-1]处。将tree[0..num-1]作为索引数组。排序改为从大到小。对索引数组排序后,每次从最后选出2个最小值,相加后的结点权值放在索引数组最后,结点索引放在索引数组中倒数第2个位置,然后索引数组大小减1,并将最后一个索引值插入到前面的有序表中,保证索引数组仍然有序。 * huffman_f 在huffman_e的基础上,将排序改为利用堆排序原理选择最小的两个权值。也即,将所有元素的权值组织成堆后,每次堆内的根结点就是最小值了。每取出一个根结点后,就把堆尾元素调到根结点重建堆。取出两个最小值合并成一个子树后,再把子树作为叶子结点放到堆中,并让其上升到合适的位置,保持堆性质不变。因为每次不必完成整个排序过程,而只是组织成堆,因此,这种方法要比使用快速排序更快。上述算法参考了mg-1.2.1中Huffman编码的实现,见http://www.cs.mu.oz.au/mg/ * huffman_g 当元素权值已经有序时,可以使用A. Moffat和J. Katajainen设计的在权值数组内部构建Huffman的方法。A. Moffat和J. Katajainen对该算法的描述见http://www.cs.mu.oz.au/~alistair/abstracts/inplace.html * huffman_h 在huffman_f的基础上,增加限制码长的功能。限制码长的算法参考了zlib-1.1.4中构造限制码长的Huffman编码的源代码。zlib的源代码见http://www.gzip.org/zlib/,其中限制长度的算法在tree.c的gen_bitlen()函数中。 上述8种算法分别对应于8个同名C++类,这些类都是由huffman_base类派生的。huffman_base类提供了与Huffman算法相关的大多数通用功能,如编码转换、Canonical Huffman编码生成、Huffman编码验证等等。 main.cpp中的tester类提供了用随机数据测试上述8种算法,并显示算法的运行时间及运行结果的功能。 ---------- 编译和运行 ---------- Windows: 使用Visual Studio .NET(建议使用VS .NET 2003或以上版本)打开Huffman.sln,编译生成并运行huffman.exe即可。 Linux: 系统中应已安装GNU gcc(建议安装gcc 3.2.2或以上版本)。本目录下的Makefile是Linux下的工程文件,直接在本目录下执行make命令即可生成可执行程序Huffman。

近期下载者

相关文件


收藏者