基于静态huffman编码的压缩
名词解释:哈夫曼编码(HuffmanCoding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。该方法依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。 实现过程: 1.计算每个字符在字符串中出现的频率作为构建h
名词解释:哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。该方法依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
实现过程:
1.计算每个字符在字符串中出现的频率作为构建huffman树的权重
2.构建huffman树
3.建立每个字符对应的编码表
4.重建字符串编码,既压缩字符串
5.解压时根据先前的huffman树和字符位长度还原字符串
<?php /** 基于静态huffman编码的压缩[PHP语言实现] author: lajabs email: aGl0dHlvQGdtYWlsLmNvbQ== 本文以PHP作为描述语言较详细讲解huffman树原理及应用 因保证程序可读性,故不做优化. */ class huffman { /** * 压缩入口 * $str:待压缩的字符串 */ public function encode($str) { $len=strlen($str); //计算每个字符权重值(出现的频度)<这边可以做成概率表> for($i=0;$i<$len;$i++) $array[ord($str{$i})]++; $HuffmanArray=array(); asort($array); /** * 构造huffman树,时间复杂度O(nlogn) * 选择两个使用频率较小<字符在字符串中出现的次数>的结点合并生成出一个树 */ while ($item1 = each($array)) { $item2 = each($array); //构建huffman树 $this->creat_tree($item1,$item2,$array,$HuffmanArray); //反复排序<优化这步可在构造树时用插入排序算法完成> asort($array); } $HuffmanArray=array_shift($HuffmanArray); //构建编码表<这步可优化为构建树时一同生成> $tab=null; $code_tab=$this->creat_tab($HuffmanArray,$tab); //压缩&转换整个字符串为二进制表达式 $binary=null; for($i=0;$i<$len;$i++) $binary.=$tab[ord($str{$i})]; //转化为压缩后的字符串 $code=$this->encode_bin($binary); //静态huffman编码算法压缩后需保留huffman树 return array('tree'=>$HuffmanArray,'len'=>strlen($binary),'code'=>$code); } /** * 解压缩入口 * $huffman:解压所使用的huffman树 * $str:被压缩的字符 * $blen:压缩前的位长度 */ public function decode($huffman,$str,$blen) { $len=strlen($str); $binary=null; //将编码解为二进制表达式 for($i=0;$i<$len;$i++) $binary.=str_pad(base_convert(ord($str{$i}),10,2),8,'0',STR_PAD_LEFT); //去除补码 $binary=substr($binary,0,$blen); //从hufman树中配比相应的编码 return $this->decode_tree($binary,$huffman,$huffman); } /** * 将压缩后的二进制表达式再转为字符串 * $binary:二进制表达式字串 */ private function encode_bin($binary) { $len=strlen($binary); //二进制转字符需要整8位,不足8位补0 $blen=$len+8-$len%8; $binary=str_pad($binary,$blen,'0'); $encode=null; //每8位转为一个字符 for($i=7;$i<$blen;$i+=8) { $frag=substr($binary,$i-7,8); $encode.=chr(base_convert($frag,2,10)); } return $encode; } /** * 构造huffman树,使用贪婪算法选择最小的两个元素作为树的子节点 * $item1:权重最小的元素1 * $item2:权重次小的元素2 * $array:所有字符出现次数表<权重表> * $HuffmanArray:保存生成的huffman树结构 */ private function creat_tree($item1,$item2,&$array,&$HuffmanArray) { list($k,$v)=$item1; list($k2,$v2)=$item2; //假设当前树的左右节点为空节点 $c1=$k; $c2=$k2; //判断两个元素若为树则直接作为节点并入主树 if(isset($HuffmanArray[$k2])) { $c2=$HuffmanArray[$k2]; unset($HuffmanArray[$k2]); } if(isset($HuffmanArray[$k])) { $c1=$HuffmanArray[$k]; unset($HuffmanArray[$k]); } //设置树结点权值 $array[$k2]=$v+$v2; //合并节点后删除元素 unset($array[$k]); //合并到huffman树中 $HuffmanArray[$k2]=array(0=>$c1,1=>$c2); } /** * 广度优先遍历树,得到所有原字符对应的二进制表达式<01010...> * $tree:已经构建好的huffman树 * $tab:编码表,保存所有字符对应的编码 * $a0:左遍历树的路径<11010...> * $a1:右遍历树的路径 */ private function creat_tab($tree,&$tab,$a0=null,$a1=null) { if($tree==null) return; //遍历左右子树 foreach($tree as $node=>$ctree) { if(is_array($ctree)) { //判断未到达叶子节点时再向下遍历 $this->creat_tab($ctree,$tab,$a0.$node,$a1.$node); } else { //遍历到叶子节点<原字符ascii码>时的所有路径,既二进制表达式,下同 $tab[$ctree]=${'a'.$node}.$node; } } } /** * 使用进制表达式深度优先遍历树,0为左子树,1为右子树,而到根节点,即为二进制表达式所指向的原字符 * $binary:二进制表达式字串 * $huffman:huffman树 * $tree:当前所遍历的子树 * $i:指向二进制表达式字串的<指针> * $code:解码后的字符串 */ private function decode_tree($binary,$huffman,$tree,$i=0,$code=null) { $lr=$binary{$i}; //遍历完成 if($lr==null) return $code; //判断是否到根节点,根节点既为二进制表达式对应的原字符ascii码 if(is_array($tree[$lr])) { //继续向下遍历子树 return $this->decode_tree($binary,$huffman,$tree[$lr],$i+1,$code); } else { //将二进制表达式解码为原字符 $code.=chr($tree[$lr]); return $this->decode_tree($binary,$huffman,$huffman,$i+1,$code); } } } ?>
$str=' In computer science and information theory, Huffman coding is an entropy encoding algorithm used for lossless data compression. The term refers to the use of a variable-length code table for encoding a source symbol (such as a character in a file) where the variable-length code table has been derived in a particular way based on the estimated probability of occurrence for each possible value of the source symbol. It was developed by David A. Huffman while he was a Ph.D. student at MIT, and published in the 1952 paper "A Method for the Construction of Minimum-Redundancy Codes". '; $huffman=new huffman(); $obj=$huffman->encode($str); echo '压缩前的编码长度:',strlen($str),"\n"; echo '压缩后的编码:',"\n"; var_dump($obj['code']); echo '解压后的字符:',$huffman->decode($obj['tree'],$obj['code'],$obj['len']);
压缩前的编码长度:587压缩后的编码:string(330) "sp閉h颚?6鵞+王d挓吷s霒zk洚磗脎|t?*?;娳9蹴??>楏4O3 5 F凣rRuJ解压后的字符:In computer science and information theory, Huffman coding is an entropy encoding algorithm used for lossless data compression. The term refers to the use of a variable-length code table for encoding a source symbol (such as a character in a file) where the variable-length code table has been derived in a particular way based on the estimated probability of occurrence for each possible value of the source symbol. It was developed by David A. Huffman while he was a Ph.D. student at MIT, and published in the 1952 paper "A Method for the Construction of Minimum-Redundancy Codes".

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Durch die Speicherkomprimierung unter Windows 11 verschluckt sich Ihr Gerät selbst bei begrenzter RAM-Menge. In diesem Artikel zeigen wir Ihnen, wie Sie die Speicherkomprimierung unter Windows 11 aktivieren oder deaktivieren. Was ist Speicherkomprimierung? Bei der Speicherkomprimierung handelt es sich um eine Funktion, die Daten vor dem Schreiben in den RAM komprimiert und so mehr Speicherplatz darauf bereitstellt. Natürlich führen mehr im physischen Speicher gespeicherte Daten zu einem schnelleren Systembetrieb und einer besseren Gesamtleistung. Diese Funktion ist in Windows 11 standardmäßig aktiviert. Wenn sie jedoch aus irgendeinem Grund nicht aktiv ist, können Sie sie deaktivieren oder erneut aktivieren. Wie aktiviere ich die Speicherkomprimierung in Windows 11? Klicken Sie auf die Suchleiste, geben Sie PowerShell ein und klicken Sie

Ich habe festgestellt, dass das von einer bestimmten Download-Website heruntergeladene komprimierte Paket nach der Dekomprimierung größer ist als das ursprüngliche komprimierte Paket. Der Unterschied beträgt mehrere zehn KB und mehrere zehn MB. Wenn es auf eine Cloud-Festplatte oder einen kostenpflichtigen Speicherplatz hochgeladen wird, spielt es keine Rolle Wenn die Datei klein ist und viele Dateien vorhanden sind, erhöhen sich die Speicherkosten erheblich. Ich habe einige Recherchen dazu durchgeführt und kann bei Bedarf daraus lernen. Komprimierungsstufe: 9-extreme Komprimierung. Wörterbuchgröße: 256 oder 384. Je stärker das Wörterbuch komprimiert ist, desto langsamer ist der Unterschied in der Komprimierungsrate vor 256 MB. Nach 384 MB gibt es keinen Unterschied in der Komprimierungsrate Parameter: f=BCJ2, die Komprimierungsrate für Test- und Add-Parameter ist höher

Große Sprachmodelle (LLMs) sind in der Lage, flüssige und kohärente Texte zu generieren, was neue Perspektiven für Bereiche wie Konversation mit künstlicher Intelligenz und kreatives Schreiben eröffnet. Allerdings weist LLM auch einige wesentliche Einschränkungen auf. Erstens beschränkt sich ihr Wissen auf Muster, die aus Trainingsdaten erkannt werden, und es mangelt ihnen an einem echten Verständnis der Welt. Zweitens sind die Denkfähigkeiten begrenzt und können keine logischen Schlussfolgerungen ziehen oder Fakten aus mehreren Datenquellen zusammenführen. Bei komplexeren und offeneren Fragen können die Antworten von LLM absurd oder widersprüchlich werden, was als „Illusionen“ bekannt ist. Obwohl LLM in einigen Aspekten sehr nützlich ist, weist es dennoch gewisse Einschränkungen bei der Bearbeitung komplexer Probleme und realer Situationen auf. Um diese Lücken zu schließen, sind in den letzten Jahren Retrieval-Augmented-Generation-Systeme (RAG) entstanden

Viele Freunde müssen Bildschirme für Büroarbeiten aufzeichnen oder Dateien übertragen, aber manchmal verursacht das Problem zu großer Dateien große Probleme. Im Folgenden finden Sie eine Lösung für das Problem zu großer Dateien. Schauen wir uns das an. Was tun, wenn die Win10-Bildschirmaufzeichnungsdatei zu groß ist: 1. Laden Sie die Software Format Factory herunter, um die Datei zu komprimieren. Download-Adresse >> 2. Rufen Sie die Hauptseite auf und klicken Sie auf die Option „Video-MP4“. 3. Klicken Sie auf der Seite mit dem Konvertierungsformat auf „Datei hinzufügen“ und wählen Sie die zu komprimierende MP4-Datei aus. 4. Klicken Sie auf der Seite auf „Ausgabekonfiguration“, um die Datei entsprechend der Ausgabequalität zu komprimieren. 5. Wählen Sie „Geringe Qualität und Größe“ aus der Dropdown-Konfigurationsliste und klicken Sie auf „OK“. 6. Klicken Sie auf „OK“, um den Import der Videodateien abzuschließen. 7. Klicken Sie auf „Start“, um die Konvertierung zu starten. 8. Nach Abschluss können Sie

Zu den gängigen Kodierungsmethoden gehören ASCII-Kodierung, Unicode-Kodierung, UTF-8-Kodierung, UTF-16-Kodierung, GBK-Kodierung usw. Ausführliche Einführung: 1. Die ASCII-Kodierung ist der früheste Zeichenkodierungsstandard und verwendet 7-Bit-Binärzahlen zur Darstellung von 128 Zeichen, einschließlich englischer Buchstaben, Zahlen, Satzzeichen, Steuerzeichen usw. 2. Die Unicode-Kodierung ist eine Methode zur Darstellung alle Zeichen der Welt Die Standardkodierungsmethode für Zeichen, die jedem Zeichen einen eindeutigen digitalen Codepunkt zuweist. 3. UTF-8-Kodierung usw.

Eingehende Analyse der Rolle und Verwendung des Schlüsselworts „static“ in der Sprache C. In der Sprache C ist „static“ ein sehr wichtiges Schlüsselwort, das bei der Definition von Funktionen, Variablen und Datentypen verwendet werden kann. Die Verwendung des Schlüsselworts static kann die Linkattribute, den Umfang und den Lebenszyklus des Objekts ändern. Lassen Sie uns die Rolle und Verwendung des Schlüsselworts static in der C-Sprache im Detail analysieren. Statische Variablen und Funktionen: Variablen, die mit dem Schlüsselwort static innerhalb einer Funktion definiert werden, werden als statische Variablen bezeichnet, die einen globalen Lebenszyklus haben

Büroangestellte verwenden die WPS-Software sehr häufig bei der Arbeit und senden sie dann an den Leiter oder an einen bestimmten Ort. Wie komprimiert die WPS-Software sie zum Senden? . Dieser Arbeitsschritt. Organisieren Sie zunächst die Dateien und Ordner, die Sie senden möchten, im selben Ordner. Wenn Sie viele Dateien haben, empfiehlt es sich, jede Datei zu benennen, damit Sie sie beim Senden leichter identifizieren können. Zweiter Schritt: Klicken Sie dieses Mal auf diesen großen Ordner und dann mit der rechten Maustaste. Wählen Sie „Zum Archiv hinzufügen“. Schritt 3: Zu diesem Zeitpunkt hilft uns die Software automatisch beim Packen unserer Dateien. Wählen Sie „Komprimieren in XX.zip“ und klicken Sie dann auf „Jetzt komprimieren“.

Paketierung und Komprimierung sind unter Linux häufig verwendete Vorgänge, viele Benutzer neigen jedoch dazu, die beiden Konzepte zu verwechseln. In diesem Artikel werden die Unterschiede zwischen Paketierung und Komprimierung in Linux-Systemen ausführlich erläutert und anhand spezifischer Codebeispiele den Lesern ein besseres Verständnis vermittelt. Zunächst müssen wir den Unterschied zwischen Verpackung und Komprimierung klären. Beim Packen handelt es sich um die Kombination mehrerer Dateien oder Verzeichnisse in einer einzigen Datei, die häufig zum Organisieren, Archivieren oder Übertragen von Dateien verwendet wird. Bei der Komprimierung werden eine oder mehrere Dateien mithilfe eines Algorithmus komprimiert, um die Größe der Datei zu verringern, Speicherplatz zu sparen oder die Übertragung zu beschleunigen.
