明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2424|回复: 6

[求助] 如何压缩表?

[复制链接]
发表于 2009-10-16 19:25:00 | 显示全部楼层 |阅读模式

 假设有一个表长度在5000以上(可能有长达几十万的)

表内容大致如下

希望能够有简明的压缩算法对Lisp的表进行压缩

(setq lst (list 248 16 0 0 0 185 164 190 223 177 166 207 228 0 68 58 92 103 100 105 112 108 117
115 46 100 108 108 0 0 13 0 46 0 92 0 103 0 100 0 105 0 112 0 108 0 117 0 115 0
46 0 100 0 108 0 108 0 3 0 68 0 58 0 92 0 96 0 0 0 3 0 0 160 88 0 0 0 0 0 0 0
112 99 45 50 48 48 57 48 55 48 56 50 49 50 49 0 18 252 31 244 56 63 152 67 186
22 201 146 148 218 37 143 10 18 49 105 66 186 222 17 189 116 0 240 244 38 27
252 18 252 31 244 56 63 152 67 186 22 201 146 148 218 37 143 10 18 49 105 66
186 222 17 189 116 0 240 244 38 27 252 0 0 0 0 76 0 0 0 1 20 2 0 0 0 0 0 192 0
0 0 0 0 0 70 155 0 0 0 32 0 0 0 73 37 209 220 18 19 201 1 218 97 235 106 218 43
202 1 73 37 209 220 18 19 201 1 0 80 26 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 119 0 20 0 31 80 224 79 208 32 234 58 105 16 162 216 8 0 43 48 48 157 25 0 47
68 58 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 0 50 0 0 80 26 0 42 57 5 56
32 0 103 100 105 112 108 117 115 46 100 108 108 0 46 0 3 0 4 0 239 190 42 57 5
56 34 59 66 116 20 0 0 0 103 0 100 0 105 0 112 0 108 0 117 0 115 0 46 0 100 0
108 0 108 0 0 0 26 0 0 0 69 0 0 0 28 0 0 0 1 0 0 0 28 0 0 0 53 0 0 0 0 0 0 0 68
0 0 0 25 0 0 0 3 0 0 0 42 83 107 248 16 0 0 0 185 164 190 223 177 166 207 228 0
68 58 92 103 100 105 112 108 117 115 46 100 108 108 0 0 13 0 46 0 92 0 103 0
100 0 105 0 112 0 108 0 117 0 115 0 46 0 100 0 108 0 108 0 3 0 68 0 58 0 92 0
96 0 0 0 3 0 0 160 88 0 0 0 0 0 0 0 112 99 45 50 48 48 57 48 55 48 56 50 49 50
49 0 18 252 31 244 56 63 152 67 186 22 201 146 148 218 37 143 10 18 49 105 66
186 222 17 189 116 0 240 244 38 27 252 18 252 31 244 56 63 152 67 186 22 201
146 148 218 37 143 10 18 49 105 66 186 222 17 189 116 0 240 244 38 27 252 0 0 0
0 0 100 0 105 0 112 0 108 0 117 0 115 0 46 0 100 0 108 0 108 0 0 0 26 0 0 0 69
0 0 0 28 0 0 0 1 0 0 0 28 0 0 0 53 0 0 0 0 0 0 0 68 0 0 0 25 0 0 0 3 0 0 0 42
83 107 248 16 0 0 0 185 164 190 223 177 166 207 228 0 68 58 92 103 100 105 112
108 117 115 46 100 108 108 0 0 13 0 46 0 92 0 103 0 100 0 105 0 112 0 108 0 117
0 115 0 46 0 100 0 108 0 108 0 3 0 68 0 58 0 92 0 96 0 0 0 3 0 0 160 88 0 0 0 0
0 0 0 112 99 45 50 48 48 57 48 55 48 56 50 49 50 49 0 18 252 31 244 56 63 152
67 186 22 201 146 148 218 37 143 10 18 49 105 66 186 222 17 189 116 0 240 244
38 27 252 18 252 31 244 56 63 152 67 186 22 201 146 148 218 37 143 10 18 49 105
66 186 222 17 189 116 0 240 244 38 27 252 0 0 0 0 76 0 0 0 1 20 2 0 0 0 0 0 192
0 0 0 0 0 0 70 155 0 0 0 32 0 0 0 73 37 209 220 18 19 201 1 218 97 235 106 218
43 202 1 73 37 209 220 18 19 201 1 0 80 26 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 119 0 20 0 31 80 224 79 208 32 234 58 105 16 162 216 8 0 43 48 48 157 25
0 47 68 58 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72 0 50 0 0 80 26 0 42 57 5
56 32 0 103 100 105 112 108 117 115 46 100 108 108 0 46 0 3 0 4 0 239 190 42 57
5 56 34 59 66 116 20 0 0 0 103 0 100 0 105 0 112 0 108 0 117 0 115 0 46 0 100 0
108 0 108 0 0 0 26 0 0 0 69 0 0 0 28 0 0 0 1 0 0 0 28 0 0 0 53 0 0 0 0 0 0 0 68
0 0 0 25 0 0 0 3 0 0 0 42 83 107 248 16 0 0 0 185 164 190 223 177 166 207 228 0
68 58 92 103 100 105 112 108 117 115 46 100 108 108 0 0 13 0 46 0 92 0 103 0
100 0 105 0 112 0 108 0 117 0 115 0 46 0 100 0 108 0 108 0 3 0 68 0 58 0 92 0
96 0 0 0 3 0 0 160 88 0 0 0 0 0 0 0 112 99 45 50 48 48 57 48 55 48 56 50 49 50
49 0 18 252 31 244 56 63 152 67 186 22 201 146 148 218 37 143 10 18 49 105 66
186 222 17 189 116 0 240 244 38 27 252 18 252 31 244 56 63 152 67 186 22 201
146 148 218 37 143 10 18 49 105 66 186 222 17 189 116 0 240 244 38 27 252 0 0 0
0 76 0 0 0 1 20 2 0 0 0 0 0 192 0 0 0 0 0 0 70 155 0 0 0 32 0 0 0 73 37 209 220
18 19 201 1 218 97 235 106 218 43 202 1 73 37 209 220 18 19 201 1 0 80 26 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 119 0 20 0 31 80 224 79 208 32 234 58 105
16 162 216 8 0 43 48 48 157 25 0 47 68 58 92 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 72 0 50 0 0 80 26 0 42 57 5 56 32 0 103 100 105 112 108 117 115 46 100 108
108 0 46 0 3 0 4 0 239 190 42 57 5 56 34 59 66 116 20 0 0 0 103 0 100 0 105 0
112 0 108 0 117 0 115 0 46 0 100 0 108 0 108 0 0 0 26 0 0 0 69 0 0 0 28 0 0 0 1
0 0 0 28 0 0 0 53 0 0 0 0 0 0 0 68 0 0 0 25 0 0 0 3 0 0 0 42 83 107))

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2009-10-17 10:42:00 | 显示全部楼层
OH 老猫, 用7z压缩,哈哈(开个玩笑)
明经网友  发表于 2009-10-17 11:06:00
闲聊:压缩的基础是统计,即编码的范围(并不一定0~255都会使用)及各编码及其排列出现的频率。
回复 支持 反对

使用道具

发表于 2009-10-17 11:17:00 | 显示全部楼层

藉助 7-Zip (Freeware) 的Dos参数亦是个简省之道
http://blog.roodo.com/emisjerry/archives/23291.html

另 arj;rar.... 雷同

 楼主| 发表于 2009-10-17 15:21:00 | 显示全部楼层

程序实现的目的如下:

使用lisp对任意文件进行二进制读取

转为文本数字存在Lisp里面 并能够反输出为原文件

实现Lisp封装任意文件(如 DLL ARX DWG JPG EXE 等所有类型的文件)

测试时 一个677KB的文件 读取的表长度为692473 存入Txt文本大小为2.31MB

为了缩短程序的运行时间和存储大小

需要用Lisp来实现这个压缩计算的过程

 楼主| 发表于 2009-10-17 15:33:00 | 显示全部楼层
几个常见的压缩算法(转)

再学习了haffman算法之后发现压缩算法很有意思,上网查了点资料,这是做好的一篇(主要是我能理解)。前面几种都能看懂,关键是那个LZ77算法。这个是很强大的压缩算法,zip,rar用得都是这种算法,让我们来感叹下两个犹太人的强大!!!

几个常见的压缩算法(转)

(一) 字典算法
字典算法是最为简单的压缩算法之一。它是把文本中出现频率比较多的单词或词汇组合做成一个对应的字典列表,并用特殊代码来表示这个单词或词汇。例如:
有字典列表:
00=Chinese
01=People
02=China
源文本:I am a Chinese people,I am from China 压缩后的编码为:I am a 00 01,I am from 02。压缩编码后的长度显著缩小,这样的编码在SLG游戏等专有名词比较多的游戏中比较容易出现,比如《SD高达》。

(二) 固定位长算法(Fixed Bit Length Packing)
这种算法是把文本用需要的最少的位来进行压缩编码。
比 如八个十六进制数:1,2,3,4,5,6,7,8。转换为二进制为:00000001,00000010,00000011,00000100, 00000101,00000110,00000111,00001000。每个数只用到了低4位,而高4位没有用到(全为0),因此对低4位进行压缩编 码后得到:0001,0010,0011,0100,0101,0110,0111,1000。然后补充为字节得到:00010010, 00110100,01010110,01111000。所以原来的八个十六进制数缩短了一半,得到4个十六进制数:12,34,56,78。
这也是比较常见的压缩算法之一。

(三) RLE算法
这种压缩编码是一种变长的编码,RLE根据文本不同的具体情况会有不同的压缩编码变体与之相适应,以产生更大的压缩比率。

  变体1:重复次数+字符
文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

  变体2:特殊字符+重复次数+字符
文本字符串:A A A A A B C C C C B C C C,编码后得到:B B 5 A B B 4 C B B 3 C。编码串的最开始说明特殊字符B,以后B后面跟着的数字就表示出重复的次数。

  变体3:把文本每个字节分组成块,每个字符最多重复 127 次。每个块以一个特殊字节开头。那个特殊字节的第 7 位如果被置位,那么剩下的7位数值就是后面的字符的重复次数。如果第 7 位没有被置位,那么剩下 7 位就是后面没有被压缩的字符的数量。例如:文本字符串:A A A A A B C D E F F F。编码后得到:85 A 4 B C D E 83 F(85H= 10000101B、4H= 00000100B、83H= 10000011B)

  以上3种不RLE变体是最常用的几种,其他还有很多很多变体算法,这些算法在Winzip Winrar这些软件中也是经常用到的。

(四) LZ77算法
LZ77算法是由 Lempel-Ziv 在1977发明的,也是GBA内置的压缩算法。LZ77算法有许多派生算法(这里面包括 LZSS算法)。它们的算法原理上基本都相同,无论是哪种派生算法,LZ77算法总会包含一个动态窗口(Sliding Window)和一个预读缓冲器(Read Ahead Buffer)。动态窗口是个历史缓冲器,它被用来存放输入流的前n个字节的有关信息。一个动态窗口的数据范围可以从 0K 到 64K,而LZSS算法使用了一个4K的动态窗口。预读缓冲器是与动态窗口相对应的,它被用来存放输入流的前n个字节,预读缓冲器的大小通常在0 – 258 之间。这个算法就是基于这些建立的。用下n个字节填充预读缓存器(这里的n是预读缓存器的大小)。在动态窗口中寻找与预读缓冲器中的最匹配的数据,如果匹 配的数据长度大于最小匹配长度 (通常取决于编码器,以及动态窗口的大小,比如一个4K的动态窗口,它的最小匹配长度就是2),那么就输出一对〈长度(length),距离 (distance)〉数组。长度(length)是匹配的数据长度,而距离(distance)说明了在输入流中向后多少字节这个匹配数据可以被找到。

  例如:(假设一个 10个字节的动态窗口, 以及一个5个字节的预读缓冲器)
文本:A A A A A A A A A A A B A B A A A A A
--------------------- =========
动态窗口 预读缓存器
动 态窗口中包含10个A ,这就是最后读取的10个字节。预读缓冲器包含了 B A B A A。编码的第一步就是寻找动态窗口与预读缓存器相似长度大于2的字节部分。在动态窗口中找不到B A B A A,所以B就被按照字面输出。然后动态窗口滑过1个字节,现在暂时输出了一个B。
第二步:A A A A A A A A A A A B A B A A A A A
--------------------- =========
动态窗口 预读缓存器
现 在预读缓冲器包含A B A A A,然后再和动态窗口进行比较。这时,在动态窗口找到了相似长度为2的A B,因此一对〈长度, 距离〉就被输出了。长度(length)是2 并且向后距离也是2,所以输出为<2,2>,然后动态窗口滑过2个字节。现在已经输出了B <2,2>。
第三步:A A A A A A A A A A A B A B A A A A A
--------------------- =========
动态窗口 预读缓存器
继续上面的方法得到输出结果<5,8>。现在已经输出了B <2,2> <5,8>。
最终的编码结果是:A A A A A A A A A A A B <2,2> <5,8>。
但 数组是无法直接用二进制来表示的,LZ77会把编码每八个数分成一组,每组前用一个前缀标示来说明这八个数的属性。比如数据流:A B A C A C B A C A按照LZ77的算法编码为:A B A C<2,2> <4,5>,刚好八个数。按照LZ77的规则,用“0”表示原文输出,“1”表示数组输出。所以这段编码就表示为:00001111B(等于 0FH),因此得到完整的压缩编码表示:F A B A C 2 2 4 5。虽然表面上只缩短了1个字节的空间,但当数据流很长的时候就会突出它的优势,这种算法在zip格式中是经常用到。

  除此之外还有很多压缩算法,像霍夫曼编码(Huffman Encoding)等等。这些编码也是非常的著名而且压缩效率极高,不过这些编码的算法相对比较繁琐,规则也很复杂,由于篇幅就不逐一介绍了。如果大家对这方面感兴趣可以到网站相关网站查询资料。

发表于 2009-10-17 15:35:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-6 09:39 , Processed in 0.191530 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表