婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP實現Huffman編碼/解碼的示例代碼

PHP實現Huffman編碼/解碼的示例代碼

熱門標簽:遼寧ai電銷機器人價格 上海做外呼線路的通信公司 房產中介用的是什么外呼系統 地圖標注專員怎么樣 電話機器人銷售主要負責什么 長沙做地圖標注公司 寧波外呼營銷系統 四川保險智能外呼系統供應商 福建銀行智能外呼系統價格

Huffman 編碼是一種數據壓縮算法。我們常用的 zip 壓縮,其核心就是 Huffman 編碼,還有在 HTTP/2 中,Huffman 編碼被用于 HTTP 頭部的壓縮。

本文就來用 PHP 來實踐一下 Huffman 編碼和解碼。

1. 編碼

字數統計

Huffman編碼的第一步就是要統計文檔中每個字符出現的次數,PHP的內置函數 count_chars() 就可以做到:

$input = file_get_contents('input.txt');
$stat = count_chars($input, 1);

構造Huffman樹

接下來根據統計結果構造Huffman樹,構造方法在 Wikipedia 有詳細的描述。這里用PHP寫了一個簡易版的:

$huffmanTree = [];
foreach ($stat as $char => $count) {
  $huffmanTree[] = [
    'k' => chr($char),
    'v' => $count,
    'left' => null,
    'right' => null,
  ];
}

// 構造樹的層級關系,思想見wiki:https://zh.wikipedia.org/wiki/%E9%9C%8D%E5%A4%AB%E6%9B%BC%E7%BC%96%E7%A0%81
$size = count($huffmanTree);
for ($i = 0; $i !== $size - 1; $i++) {
  uasort($huffmanTree, function ($a, $b) {
    if ($a['v'] === $b['v']) {
      return 0;
    }
    return $a['v']  $b['v'] ? -1 : 1;
  });
  $a = array_shift($huffmanTree);
  $b = array_shift($huffmanTree);
  $huffmanTree[] = [
    'v' => $a['v'] + $b['v'],
    'left' => $b,
    'right' => $a,
  ];
}
$root = current($huffmanTree);

經過計算之后,$root 就會指向 Huffman 樹的根節點

根據Huffman樹生成編碼字典

有了 Huffman 樹,就可以生成用于編碼的字典:

function buildDict($elem, $code = '', $dict) {
  if (isset($elem['k'])) {
    $dict[$elem['k']] = $code;
  } else {
    buildDict($elem['left'], $code.'0', $dict);
    buildDict($elem['right'], $code.'1', $dict);
  }
}
$dict = [];
buildDict($root, '', $dict);

寫文件

運用字典將文件內容進行編碼,并寫入文件。將Huffman編碼寫入文件的有幾個注意的地方:

將編碼字典和編碼內容一起寫入文件后,就沒法區分他們的邊界了,因此需要在文件開始寫入他們各自占用的字節數

PHP提供的 fwrite() 函數一次能寫入 8-bit(一個字節)或者是 8的整數倍個bit。但Huffman編碼中,一個字符可能只使用 1-bit 表示,PHP不支持只往文件中寫入 1-bit 這種操作。所以需要我們自行對編碼進行拼接,每湊齊 8-bit 才寫入文件。

每湊齊8-bit才寫入

與第二條類似,最終形成的文件大小一定是 8-bit 的整數倍。所以如果整個編碼的大小是 8001-bit的話,還要在末尾補上 7個 0

$dictString = serialize($dict);
// 寫入字典和編碼各自占用的字節數
$header = pack('VV', strlen($dictString), strlen($input));
fwrite($outFile, $header);
// 寫入字典本身
fwrite($outFile, $dictString);

// 寫入編碼的內容
$buffer = '';
$i = 0;
while (isset($input[$i])) {
  $buffer .= $dict[$input[$i]];
  while (isset($buffer[7])) {
    $char = bindec(substr($buffer, 0, 8));
    fwrite($outFile, chr($char));
    $buffer = substr($buffer, 8);
  }
  $i++;
}
// 末尾的內容如果沒有湊齊 8-bit,需要自行補齊
if (!empty($buffer)) {
  $char = bindec(str_pad($buffer, 8, '0'));
  fwrite($outFile, chr($char));
}
fclose($outFile);

解碼

Huffman編碼的解碼相對簡單:先讀取編碼字典,然后根據字典解碼出原始字符。

解碼過程有個問題需要注意:由于我們在編碼過程中,在文件末尾補齊了幾個0-bit,如果這些 0-bit 在字典中恰巧是某個字符的編碼時,就會造成錯誤的解碼。

所以解碼過程中,當已解碼的字符數達到文檔長度時,就要停止解碼。

?php
$content = file_get_contents('a.out');

// 讀出字典長度和編碼內容長度
$header = unpack('VdictLen/VcontentLen', $content);
$dict = unserialize(substr($content, 8, $header['dictLen']));
$dict = array_flip($dict);

$bin = substr($content, 8 + $header['dictLen']);
$output = '';
$key = '';
$decodedLen = 0;
$i = 0;
while (isset($bin[$i])  $decodedLen !== $header['contentLen']) {
  $bits = decbin(ord($bin[$i]));
  $bits = str_pad($bits, 8, '0', STR_PAD_LEFT);
  for ($j = 0; $j !== 8; $j++) {
    // 每拼接上 1-bit,就去與字典比對是否能解碼出字符
    $key .= $bits[$j];
    if (isset($dict[$key])) {
      $output .= $dict[$key];
      $key = '';
      $decodedLen++;
      if ($decodedLen === $header['contentLen']) {
        break;
      }
    }
  }
  $i++;
}
echo $output;

試驗

我們將Huffman編碼Wiki頁 的HTML代碼保存到本地,進行Huffman編碼測試,試驗結果:

編碼前: 418,504 字節

編碼后: 280,127 字節

空間節省了 33%,如果原文的重復內容較多,Huffman編碼節省的空間可以達到 50% 以上.

除了文本內容,我們再嘗試將一個二進制文件進行Huffman編碼,比如 f.lux的安裝程序 ,試驗結果如下:

編碼前: 770,384 字節

編碼后: 773,076 字節

編碼后反而占用了更大的空間,一方面是由于我們存儲字典時,并沒有做額外的處理,占用了不少空間。另一方面,二進制文件中,各個字符出現的概率相對比較平均,無法發揮Huffman編碼的優勢。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • PHP 獲取視頻時長的實例代碼
  • PHP多維數組指定多字段排序的示例代碼
  • Php多進程實現代碼
  • PHP 計算兩個特別大的整數實例代碼
  • PHP生成(支持多模板)二維碼海報代碼
  • PHP實現數據庫的增刪查改功能及完整代碼
  • php無限級評論嵌套實現代碼
  • 如何避免PHP實例代碼中的一些壞代碼

標簽:宿遷 延安 澳門 工商登記 宜春 常德 佛山 深圳

巨人網絡通訊聲明:本文標題《PHP實現Huffman編碼/解碼的示例代碼》,本文關鍵詞  PHP,實現,Huffman,編碼,解碼,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP實現Huffman編碼/解碼的示例代碼》相關的同類信息!
  • 本頁收集關于PHP實現Huffman編碼/解碼的示例代碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩理论片一区二区| 激情五月激情综合网| 国产精品人妖ts系列视频| 国产精品福利影院| 亚洲最大成人综合| 精品亚洲国内自在自线福利| 在线观看一区二区视频| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品国产三级国产aⅴ中文 | 欧美一级日韩一级| 亚洲电影一级片| 制服丝袜亚洲精品中文字幕| 国产精品理论片在线观看| 一区在线观看视频| 久久99久久精品| 欧美日韩国产高清一区二区三区| 亚洲国产一区二区三区青草影视| 色综合久久综合| 麻豆精品蜜桃视频网站| 国产亚洲人成网站| 精品视频123区在线观看| 亚洲影视在线观看| 久久综合九色综合欧美亚洲| 91麻豆免费视频| 国产午夜精品在线观看| 免费在线成人网| 欧美国产禁国产网站cc| 欧美高清激情brazzers| 国产成人精品亚洲午夜麻豆| 中文字幕亚洲成人| 国产午夜亚洲精品理论片色戒| 色综合天天综合网国产成人综合天| 日韩中文字幕av电影| 欧美一卡二卡三卡四卡| 成人免费毛片片v| 日韩精品成人一区二区在线| 久久久久久久久久久黄色| 成人免费毛片a| 精品亚洲成a人| 国产酒店精品激情| 一区二区久久久久| 中文字幕av一区 二区| 欧美伦理影视网| 色94色欧美sute亚洲线路二| 91国内精品野花午夜精品| 色欧美日韩亚洲| 正在播放一区二区| 精品99一区二区三区| 精品日本一线二线三线不卡| 日韩精品在线网站| 中文字幕一区二区三区不卡在线| 国产精品美女久久福利网站| 亚洲精品日日夜夜| 美女精品一区二区| 99久久伊人精品| 欧美日韩一二三区| 久久久久久久久久美女| 亚洲国产激情av| 一区二区在线观看不卡| 亚洲一级在线观看| 亚洲国产精品嫩草影院| 久久成人av少妇免费| 99国产欧美另类久久久精品| 欧美性生活一区| 国产精品沙发午睡系列990531| 亚洲国产欧美在线| 91日韩在线专区| 久久先锋影音av鲁色资源| 亚洲精品成人悠悠色影视| 狂野欧美性猛交blacked| 国产伦精品一区二区三区在线观看| 国产河南妇女毛片精品久久久| 91成人免费在线| 2021国产精品久久精品| 天天综合天天综合色| 99久久精品情趣| 国产精品资源在线| 337p亚洲精品色噜噜狠狠| 国产激情视频一区二区三区欧美| 青青草国产成人99久久| 欧美日韩精品欧美日韩精品| 欧美色中文字幕| 国产尤物一区二区| 一二三区精品视频| 国产精品久久久久精k8 | 欧美日韩一区二区在线观看| 欧美激情一区二区| 丰满白嫩尤物一区二区| 中文一区一区三区高中清不卡| 国产一区二区美女| 最新欧美精品一区二区三区| 99国产欧美另类久久久精品| 一区二区三区日韩精品| 欧美日韩另类一区| 精品在线视频一区| 国产精品美女久久久久久久久 | 精品一区二区三区在线播放| 国产乱码精品一区二区三 | 91论坛在线播放| 国内偷窥港台综合视频在线播放| 亚洲欧美经典视频| 日本一区二区免费在线观看视频| 色一情一乱一乱一91av| 国产不卡高清在线观看视频| 久久69国产一区二区蜜臀| 亚洲一区视频在线| 中文字幕制服丝袜成人av| 国产日韩欧美一区二区三区综合| 日韩午夜精品电影| 欧美第一区第二区| 欧美xxxxxxxxx| 久久久久国产精品麻豆ai换脸| 欧美在线综合视频| 91在线视频官网| 久久蜜桃一区二区| 精品亚洲成a人在线观看| 亚洲欧洲日产国码二区| 亚洲香肠在线观看| 不卡视频一二三四| 久久久久成人黄色影片| 亚洲成a人片在线不卡一二三区| 一级做a爱片久久| 亚洲一区二区三区中文字幕| 日本少妇一区二区| 国产麻豆欧美日韩一区| 99国产欧美另类久久久精品| 69精品人人人人| 1024成人网色www| 国产精品影音先锋| 欧美无砖专区一中文字| 国产日韩欧美a| 麻豆视频观看网址久久| 91网站在线播放| 中文字幕av一区二区三区高| 欧美日韩免费高清一区色橹橹| 久久亚洲精华国产精华液 | 欧美人狂配大交3d怪物一区| 91麻豆精品久久久久蜜臀 | 91最新地址在线播放| 欧美一区二区三区公司| 日韩美女视频一区二区| 精品一区二区久久久| 色综合久久综合中文综合网| 久久综合精品国产一区二区三区| 视频一区欧美日韩| 555www色欧美视频| 欧美丰满一区二区免费视频| 国产精品麻豆网站| 丰满白嫩尤物一区二区| 国产亚洲精品久| 成人av电影在线播放| 一区二区三区在线观看网站| 色婷婷久久久综合中文字幕| 亚洲一区二区三区视频在线| 欧美性受极品xxxx喷水| 亚洲第一会所有码转帖| 欧美色综合影院| 日韩成人av影视| 久久久久久黄色| 国产激情偷乱视频一区二区三区| 国产精品免费免费| 国产九色sp调教91| 亚洲日本丝袜连裤袜办公室| 欧美一区二区三区四区久久| 91婷婷韩国欧美一区二区| 美女视频一区二区三区| 亚洲午夜羞羞片| 亚洲一区二区三区四区在线 | 777久久久精品| 韩国av一区二区三区四区| 久久奇米777| 欧美午夜视频网站| 国产二区国产一区在线观看| 亚洲精品视频观看| 日韩欧美国产系列| 波多野结衣亚洲一区| 午夜精品久久久久影视| 亚洲国产精品t66y| 久久这里只有精品首页| 欧美婷婷六月丁香综合色| 不卡电影一区二区三区| 99热这里都是精品| 日韩一区日韩二区| 久久中文娱乐网| 欧美精品一区二区三区久久久| 成人h动漫精品| a亚洲天堂av| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲女与黑人做爰| 日韩高清不卡一区二区三区| 日韩三级电影网址| 欧美精品电影在线播放| 91一区二区在线| 99视频精品全部免费在线| 不卡的av网站| 欧美午夜一区二区三区免费大片| 91女厕偷拍女厕偷拍高清| 色妞www精品视频| 91精品国产综合久久精品app| 欧美精品第1页|