基于静态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".

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Windows 11에서 메모리 압축을 사용하면 제한된 양의 RAM이 있어도 장치가 질식합니다. 이 기사에서는 Windows 11에서 메모리 압축을 활성화하거나 비활성화하는 방법을 보여줍니다. 메모리 압축이란 무엇입니까? 메모리 압축은 데이터를 RAM에 쓰기 전에 압축하여 더 많은 저장 공간을 제공하는 기능입니다. 물론 물리적 메모리에 더 많은 데이터를 저장할수록 시스템 작동 속도가 빨라지고 전반적인 성능이 향상됩니다. 이 기능은 Windows 11에서 기본적으로 활성화되어 있지만 활성화되지 않은 경우 비활성화하거나 다시 활성화할 수 있습니다. Windows 11에서 메모리 압축을 활성화하는 방법은 무엇입니까? 검색창을 클릭하고 powershell을 입력한 후

특정 다운로드 사이트에서 다운로드한 압축 패키지는 압축을 푼 후 원본 압축 패키지보다 용량이 더 커지는 것을 확인했습니다. 그 차이는 수십 Kb, 수십 Mb 정도입니다. 클라우드 디스크나 유료 공간에 업로드해도 상관없습니다. 파일이 작을 경우, 파일이 많을 경우 저장 비용이 크게 증가합니다. 나는 그것에 대해 약간의 조사를 했으며 필요하다면 배울 수 있습니다. 압축 수준: 9급 압축 사전 크기: 256 또는 384, 사전을 많이 압축할수록 속도가 느려집니다. 256MB 이전에는 압축률 차이가 더 크고, 384MB 이후에는 압축률 차이가 없습니다. 단어 크기: 최대 273 매개변수: f=BCJ2, 테스트 및 추가 매개변수 압축률이 높아집니다.

LLM(대형 언어 모델)은 매끄럽고 일관된 텍스트를 생성하는 기능을 갖추고 있어 인공 지능 대화 및 창의적 글쓰기와 같은 영역에 새로운 전망을 제시합니다. 그러나 LLM에는 몇 가지 주요 제한 사항도 있습니다. 첫째, 그들의 지식은 훈련 데이터에서 인식된 패턴으로 제한되어 있으며 세상에 대한 진정한 이해가 부족합니다. 둘째, 추론 능력이 제한되어 있어 여러 데이터 소스에서 논리적 추론을 하거나 사실을 융합할 수 없습니다. 더 복잡하고 개방형 질문에 직면할 때 LLM의 답변은 "환상"이라고 알려진 터무니없거나 모순될 수 있습니다. 따라서 LLM은 일부 측면에서 매우 유용하지만 복잡한 문제와 실제 상황을 처리할 때 여전히 특정 제한 사항이 있습니다. 이러한 격차를 해소하기 위해 최근 몇 년 동안 검색 증강 생성(RAG) 시스템이 등장했습니다.

일반적인 인코딩 방법에는 ASCII 인코딩, 유니코드 인코딩, UTF-8 인코딩, UTF-16 인코딩, GBK 인코딩 등이 포함됩니다. 자세한 소개: 1. ASCII 인코딩은 7비트 이진수를 사용하여 영어 문자, 숫자, 구두점, 제어 문자 등을 포함하여 128개의 문자를 나타내는 최초의 문자 인코딩 표준입니다. 2. 유니코드 인코딩은 표현하는 데 사용되는 방법입니다. 세상의 모든 문자 각 문자에 고유한 디지털 코드 포인트를 할당하는 문자의 표준 인코딩 방법 3. UTF-8 인코딩 등

많은 친구들이 업무를 위해 화면을 녹화하거나 파일을 전송해야 하는데 때로는 파일이 너무 커서 문제가 많이 발생하는 경우가 있습니다. 다음은 너무 큰 파일의 문제에 대한 해결 방법을 살펴보겠습니다. win10 화면 녹화 파일이 너무 큰 경우 수행할 작업: 1. 소프트웨어 Format Factory를 다운로드하여 파일을 압축합니다. 다운로드 주소 >> 2. 메인 페이지에 들어가서 "Video-MP4" 옵션을 클릭하세요. 3. 변환 형식 페이지에서 "파일 추가"를 클릭하고 압축할 MP4 파일을 선택하세요. 4. 페이지에서 "출력 구성"을 클릭하여 출력 품질에 따라 파일을 압축합니다. 5. 드롭다운 구성 목록에서 "낮은 품질 및 크기"를 선택하고 "확인"을 클릭합니다. 6. "확인"을 클릭하면 비디오 파일 가져오기가 완료됩니다. 7. "시작"을 클릭하여 변환을 시작하세요. 8. 완료 후 다음을 수행할 수 있습니다.

C 언어에서 static 키워드의 역할과 사용법에 대한 심층 분석 C 언어에서 static은 함수, 변수 및 데이터 유형을 정의하는 데 사용할 수 있는 매우 중요한 키워드입니다. static 키워드를 사용하면 객체의 링크 속성, 범위, 생명주기가 변경될 수 있습니다. C 언어에서 static 키워드의 역할과 사용법을 자세히 분석해 보겠습니다. 정적 변수 및 함수: 함수 내에서 static 키워드를 사용하여 정의된 변수를 전역 수명 주기를 갖는 정적 변수라고 합니다.

직장인들은 직장에서 wps 소프트웨어를 매우 자주 사용합니다. 때로는 하루에 여러 개의 파일을 입력한 후 리더나 지정된 위치로 보냅니다. 그렇다면 wps 소프트웨어는 어떻게 폴더를 압축하고 패키지로 보내야 할까요? . 이 작업 단계. 먼저 보내려는 파일과 폴더를 동일한 폴더에 정리하세요. 파일이 많은 경우에는 보낼 때 쉽게 식별할 수 있도록 각 파일의 이름을 지정하는 것이 좋습니다. 두 번째 단계에서는 이번에는 이 큰 폴더를 클릭한 다음 마우스 오른쪽 버튼을 클릭합니다. "아카이브에 추가"를 선택하십시오. 3단계: 이제 소프트웨어가 자동으로 파일을 패키지하는 데 도움을 줍니다. "XX.zip으로 압축"을 선택한 다음 지금 압축을 클릭하세요.

WinRAR은 풍부한 기능과 사용하기 쉬운 인터페이스를 제공하는 강력한 압축 파일 관리 도구입니다. WinRAR 64비트 버전은 64비트 운영 체제에 특별히 최적화되어 있으며 시스템 리소스와 성능을 더 잘 활용할 수 있습니다. 다음으로, 편집자가 winrar 64비트를 소개하고 winrar 압축을 푸는 방법을 설명하겠습니다! 1. winrar 64비트 소프트웨어란 무엇입니까? WinRAR은 강력한 압축 패키지 관리자입니다. 이 소프트웨어는 데이터를 백업하고, 이메일 첨부 파일의 크기를 줄이고, RAR, ZIP 및 인터넷에서 다운로드한 기타 파일의 압축을 풀고, RAR 및 ZIP 형식의 새 파일을 만드는 데 사용할 수 있습니다. 최신 WINRAR 버전은 Wi입니다.
