关于压缩算法
如何在delphi中实现象winzip,winrar那样的压缩技术?恳请高手指教!!
email: vinvin2003a@yahoo.com.cn
问题点数:0、回复次数:6Top
1 楼fishy(死鱼)回复于 2003-02-04 04:26:47 得分 0
一种比较简单的压缩算法是Huffman Tree,我曾写过一个代码,前两天被我删了:P
我在这里给你描述一下算法吧
Huffman Tree的压缩原理是用不等长代码。用长度短的代码来代表出现频率高的代码,以实现压缩的目的。
因为代码不等长,所以需要任何一个代码不能是其他代码的前缀,所以可以通过建立Huffman Tree来生成Huffman代码。
比如要压缩文本:'So cool!'
转换为二进制的Ascii码为:
01010011 01101111 00100000 01100011 01101111 01101111 01101100 00100001
为64位
每个字符出现的次数分别为
S:1
o:3
:1
c:1
l:1
!:1
首先将每个字符作为单独的节点:
S:1 o:3 :1 c:1 l:1 !:1
将出现次数最少的两个节点作为左右子节点建立一二叉树,夫节点出现此书记录为子节点之和,并代替原两子节点放入队列:
2 o:3 c:1 l:1 !:1
/ \
S:1 :1
重复此过程,直到队列中只剩一个节点:
2 2 o:3 !:1
/ \ / \
S:1 :1 c:1 l:1
3 2 o:3
/ \ / \
2 !:1 c:1 l:1
/ \
S:1 :1
5 o:3
/ \
3 2
/ \ / \
2 !:1 c:1 l:1
/ \
S:1 :1
8
/ \
5 o:3
/ \
3 2
/ \ / \
2 !:1 c:1 l:1
/ \
S:1 :1
然后从根节点开始遍历此二叉树,左子树记为0,右子树记为1,遍历到每个根节点时的串就为根节点的该字符的Huffman码:
S:0000
:0001
!:001
c:010
l:011
0:1
于是'So cool!'用Huffman码表示就为:
0000 1 0001 010 1 1 011 001
比较两种编码:
Ascii :0101001101101111001000000110001101101111011011110110110000100001(64)
Huffman:00001000101011011001(20)
达到压缩目的
当然,用Huffman编码压缩后需要储存字典Top
2 楼xdspower(杂食菜熊)回复于 2003-02-04 09:10:58 得分 0
你到网络上下一个控件就可以了,或者找一个命令行工具来调用也可以的,这样的工具是十分多的。Top
3 楼oustar(欧文)回复于 2003-02-04 17:19:00 得分 0
算法不是你开发的障碍,关键是你如何定位你的应用!Top
4 楼sgoat(一天到晚游泳的鱼)回复于 2003-02-04 21:37:19 得分 0
不知道winzip用的是什么样的算法Top
5 楼ZhangYv(迎着朝阳,走向地狱)回复于 2003-02-04 21:39:52 得分 0
ZIP的压缩算法应该是公开的吧,找找就是。Top
6 楼seanzh(云剑)回复于 2003-06-16 11:14:31 得分 0
如果要压缩的不仅仅是字母和数字呢,而且重复率不高的话,HUFFMAN编码根本就起不到预期的作用Top




