自己写的一个简易的LZW编码,没认真写,只是能编码由(a~z)26个字母组成的字符串,其实扩展的话,原理是一样的。
输入一个字符串,程序输出码字,以及译码。LZW编码后发送的数据包含初始字典 。
比如:
ababcbabccc
译码为:
1 2 4 3 5 2 3 10
ababcbabccc
初始字典为:
1 2 3
根据初始字典和译码即可压缩和解压……
实际上,如果扩展之后,根本不需要传输初始字典 ==
逗比了,程序没有简化,写的略长了==
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
typedef struct node
{
char ch[100];
int key;
}node;
node arr[100000]; //压缩字典
char c[1000000];
int init[30]; //初始字典
int ans[100000]; //压缩码
node brr[100000]; //解压缩字典
char out[100000]; //解压缩结果
int main()
{
int i,j,len,k,m,n,o,pre,index,pos;
int value,idx,ddx;
char cop[100000];
while(~scanf("%s",c))
{
memset(ans,0,sizeof(ans));
memset(cop,0,sizeof(cop));
memset(init,0,sizeof(init));
memset(brr,0,sizeof(brr));
memset(out,0,sizeof(out));
memset(arr,0,sizeof(arr));
len = strlen(c);
for(i = 0;i < len;i ++)
init[c[i]-'a'] = 1;
for(k = i = 0;i < 26;i ++)
if(init[i] != 0)
{
arr[k].ch[0] = i + 'a';
arr[k].key = k + 1;
k += 1;
}
index = pre = 0;
for(i = 0;i < len;i ++)
{
memset(cop,0,sizeof(cop));
for(j = i;j < len;j ++)
{
cop[j-i] = c[j];
for(m = 0;m < k;m ++)
{
if(strcmp(arr[m].ch,cop) == 0)
{
pre = arr[m].key;
if(j == len -1) i = len;
break;
}
}
if(m == k)
{
strcpy(arr[k].ch,cop);
arr[k].key = k + 1;
k += 1;
ans[index ++] = pre;
i = j - 1;
break;
}
}
}
ans[index ++] = pre;
for(i = 0;i < index;i ++)
printf("%d ",ans[i]);
puts("");
for(k = i = 0;i < 26;i ++)
if(init[i] != 0)
{
brr[k].ch[0] = i + 'a';
brr[k].key = k + 1;
k += 1;
}
idx = ddx = pos = 0;
for(i = 0;i < index;i ++)
{
value = ans[i];
for(j = 0;j < k;j ++)
{
if(brr[j].key == value)
{
len = strlen(brr[j].ch);
for(m = 0;m < len;m ++)
{
out[idx] = brr[j].ch[m];
idx += 1;
}
for(m = pos;m < idx;m ++)
{
memset(cop,0,sizeof(cop));
for(n = m;n < idx;n ++)
{
cop[n-m] = out[n];
for(o = 0;o < k;o ++)
if(strcmp(brr[o].ch,cop) == 0)
break;
if(o == k)
{
strcpy(brr[k].ch,cop);
brr[k].key = k + 1;
k += 1;
m = n - 1;
pos = n;
break;
}
}
}
break;
}
}
if(j == k)
{
memset(cop,0,sizeof(cop));
for(m = 0;m < strlen(brr[ans[i-1]-1].ch);m ++)
cop[m] = brr[ans[i-1]-1].ch[m];
cop[m] = brr[ans[i-1]-1].ch[0];
strcpy(brr[k].ch,cop);
brr[k].key = k + 1;
k += 1;
for(m = 0;cop[m] != '\0';m ++)
{
out[idx] = cop[m];
idx += 1;
}
pos = idx-m;
}
}
printf("%s\n",out);
memset(c,0,sizeof(c));
}
return 0;
}