使用PHP-Huffman库压缩字符串

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

require_once __DIR__ . '/PHP-Huffman/Huffman.class.php';

use PHPHuffman\Huffman;
use PHPHuffman\HuffmanDictionary;


$data = 'hello, world'; // 原始字符串(数据)


//========== 编码 ==========//
$huffman1 = new Huffman();
try {
    $encode = $huffman1->encode($data);
} catch (Exception $e) {
    exit('编码失败:' . $e->getMessage());
}
$dictionary = $huffman1->getDictionary()->getDictionary(); // 获取字典


//========== 解码 ==========//
$huffman2 = new Huffman();
try {
    $huffmanDictionary = new HuffmanDictionary($dictionary);
} catch (Exception $e) {
    exit('创建字典失败:' . $e->getMessage());
}
$huffman2->setDictionary($huffmanDictionary);
try {
    $decode = $huffman2->decode($encode);
} catch (Exception $e) {
    exit('解码失败:' . $e->getMessage());
}


// 计算压缩率,公式:压缩率 = (原始大小 - 压缩大小) / 原始大小 * 100
$ratio = (strlen($data) - strlen($encode)) / strlen($data) * 100;
$ratio = round($ratio, 2);


echo "原始字符串:$data" . PHP_EOL;
echo "编码字符串:$encode" . PHP_EOL;
echo "解码字符串:$decode" . PHP_EOL;
echo '原始字符串长度:' . strlen($data) . PHP_EOL;
echo '编码字符串长度:' . strlen($encode) . PHP_EOL;
echo "压缩率:$ratio%" . PHP_EOL;
// 原始字符串:hello, world
// 编码字符串:[)z
// 解码字符串:hello, world
// 原始字符串长度:12
// 编码字符串长度:5
// 压缩率:58.33%


//========== 总结 ==========//
// 1、使用Huffman算法压缩字符串会生成一个字典,其实就是字符出现频率表,还原字符串必须使用这个字典。
// 2、Huffman算法还原字符串依赖字典,所以在保存编码字符串的同时,还需要额外的存储空间来保存字典,
//    这样就有可能会出现编码字符串加字典所占空间比原始数据还大的情况。

Copyright © 2024 码农人生. All Rights Reserved