input index prefix suffix string outPut
A A
B 263 A B AB A
A 264 B A BA B
B
A 265 263 A ABA 263
B
A
B 266 265 B ABAB 265
B 267 B B BB B
B
A 268 267 A BBA 267
B
A
B
A 269 266 A ABABA 266
A 270 A A AA A
C 271 A C AC A
D 272 C D CD C
A 273 D A DA D
C
D 274 271 D ACD 271
A
D 275 273 D DAD 273
C 276 D C DC D
A 277 C A CA C
B
A
A 278 265 A ABAA 265
A
B 279 270 B AAB 270
A
B 280 264 B BAB 264
B
原始数据占用bit位数:
32*8=256
压缩后数据占用bit位数:
18*9=162
显然 162<256 原始数据被压缩了。
以C语言为例 字典数据结构为:
struct 标号{
word 前缀;
word 后缀;
};
结构数组为:
标号标号组[4095];
压缩算法如下:
int 当前最大标号=263;
word 前缀,后缀;
char输入流[x];
int 输入序号=0
然后,我们读入第一个字符 A和第二个字符B 。
前缀=输入流[输入序号];
输入序号++;
从这里开始,我们开始压缩过程,直到把数据处理玩:
int I=263;
for(输入序号 ; 输入序号<X ; 输入序号++){
后缀=输入流[输入序号];
//查找当前串在表中的位置
bool found=false;
while ( I<当前最大标号 ) {
if ( 前缀 != 标号组[I]。前缀) {I++;continue;}
if( 后缀 != 标号组[I]。后缀 ) {I++;continue;}
//找到了,就是这个串
found=true;
前缀=I; //把当前串规约到标号
I++;
break;
}
if ( ! found ) { //没找到,把这个串加到标号组中
标号组[当前最大标号]。前缀=前缀;
标号组[当前最大标号]。后缀=后缀;
当前最大标号++;
输出 前缀
前缀=后缀;
if (当前最大标号> 4095){ //已经超过了最大的长度
当前最大标号=263;
输出字典重构 标志;
}
I=263;
}
}
解压是压缩的逆过程:
如图
input index prefix suffix stack outPut
A A
B 263 A B A
263 264 B A B
265 265 263 A AB AB
B 266 265 B ABA ABA
267 267 B B B
266 268 267 A BB BB
A 269 266 A ABAB ABAB
A 270 A A A
C 271 A C A
D 272 C D C
271 273 D A D
273 274 271 D AC AC
D 275 273 D DA DA
C 276 D C D
265 277 C A C
270 278 265 A ABA ABA
264 279 270 B AA AA
B 280 264 B BA BA
B
解压算法如下:
int 当前标号=263;
栈 stack;
int 前缀,后缀;
int 输入流[x];
int 输入序号=0
前缀=输入流[输入序号];
输入流序号++;