php实现lzw压缩

LZW压缩算法简介
LZW(Lempel-Ziv-Welch)是一种基于字典的无损压缩算法,广泛用于GIF图像格式和早期文件压缩。其核心思想是将输入的字符串序列映射为固定长度的编码,通过动态构建字典实现压缩。
PHP实现LZW压缩
以下是一个基础的PHP实现示例,包含压缩和解压两部分:
压缩函数实现
function lzw_compress($string) {
$dict = array();
for ($i = 0; $i < 256; $i++) {
$dict[chr($i)] = $i;
}
$current = "";
$result = array();
$dict_size = 256;
for ($i = 0; $i < strlen($string); $i++) {
$char = $string[$i];
$combined = $current . $char;
if (isset($dict[$combined])) {
$current = $combined;
} else {
$result[] = $dict[$current];
$dict[$combined] = $dict_size++;
$current = $char;
}
}
if ($current !== "") {
$result[] = $dict[$current];
}
return $result;
}
解压函数实现
function lzw_decompress($compressed) {
$dict = array();
for ($i = 0; $i < 256; $i++) {
$dict[$i] = chr($i);
}
$current = chr($compressed[0]);
$result = $current;
$dict_size = 256;
for ($i = 1; $i < count($compressed); $i++) {
$code = $compressed[$i];
if (isset($dict[$code])) {
$entry = $dict[$code];
} else {
$entry = $current . $current[0];
}
$result .= $entry;
$dict[$dict_size++] = $current . $entry[0];
$current = $entry;
}
return $result;
}
使用示例
$original = "TOBEORNOTTOBEORTOBEORNOT";
$compressed = lzw_compress($original);
$decompressed = lzw_decompress($compressed);
echo "Original: " . $original . "\n";
echo "Compressed: " . implode(',', $compressed) . "\n";
echo "Decompressed: " . $decompressed . "\n";
优化建议
- 二进制输出:当前实现返回数组格式,实际应用可转换为二进制格式
- 字典大小限制:为防止字典过大,可设置最大字典尺寸(如4096)
- 性能优化:对长字符串建议分块处理
- 错误处理:添加对无效输入数据的校验
注意事项
- LZW对重复模式较多的数据压缩效果较好
- PHP内置函数
gzcompress()通常性能更好,但LZW适合特定场景需求 - 专利限制:原始LZW算法曾有专利限制(已过期)







