【Algorithms 4】算法(第4版)学习笔记 24 - 5.5 数据压缩

news2024/11/26 17:46:25

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:介绍
      • 2:游程编码 run-length encoding
      • 2.1:介绍
      • 2.2:Java 实现
      • 3:霍夫曼压缩 Huffman compression
      • 3.1:变长前缀码 variable-length codes
      • 3.1.1:介绍
      • 3.1.2:前缀码单词查找树
      • 3.2:霍夫曼编码
      • 3.2.1:概述
      • 3.2.2:Java 实现:单词查找树节点
      • 3.2.3:Java 实现:扩展
      • 3.2.4:Java 实现:单词查找树、编译表
      • 3.2.5:Java 实现:压缩
      • 3.3:demo 演示
      • 3.4:小结
      • 4:LZW 压缩算法
      • 4.1:统计方法
      • 4.2:LZW 压缩
      • 4.3:LZW 扩展
      • 4.4:特殊情况
      • 4.5:Java 实现
      • 4.6:小结

前言

本篇主要内容包括:游程编码霍夫曼压缩算法LZW 压缩算法

建议在学习本篇之前先行学习或回顾 《5.2 单词查找树》的内容。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《5.5 数据压缩》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。
注3:如果 PPT 截图中没有翻译,会在下面进行汉化翻译,因为内容比较多,本文不再一一说明。

1:介绍

这个世界充满了数据,而能够有效表达数据的算法在现代计算机基础架构中有着重要的地位。压缩数据的原因主要有两点:节省保存信息所需的空间和节省传输信息所需的时间。

对于通用数据压缩:

image-20240405170417042

2:游程编码 run-length encoding

2.1:介绍

![L21-55DataCompression_15]

将 40 位长的比特字符串拆解可得:15个0,7个1,7个0,11个1(交替出现的 0 和 1)
用 4 位表示长度并以 0 开头,可以得到:15=1111,7=0111,7=0111,11=1011
即:1111011101111011

问题一:用多少比特表示游程长度?
答:用 8 位(但本例中使用 4 位)
问题二:当某个游程的长度超过了能够记录的最大长度时怎么办?
答:当运行长度超过最大值时,插入长度为0的运行进行间隔。

2.2:Java 实现

edu.princeton.cs.algs4.RunLength

![image-20240405171955560]

edu.princeton.cs.algs4.RunLength#compress

![image-20240405172110231]

3:霍夫曼压缩 Huffman compression

3.1:变长前缀码 variable-length codes

3.1.1:介绍

根据不同字符采用不同位数进行编码。

![L21-55DataCompression_19]

Q. 如何避免歧义?
**A. ** 确保任何编码都不作为其他编码的前缀存在。

示例 1. 固定长度编码。
示例 2. 在每个编码字后附加特殊终止字符。
示例 3. 实现通用的前缀码。

3.1.2:前缀码单词查找树

注:建议回顾《5.2 单词查找树》 。

![L21-55DataCompression_20]

Q. 如何表示前缀码?
A. 单词查找树!

  • 字符存储在叶子节点上。
  • 每个编码对应从树的根节点到某个叶子节点的一条路径。

![L21-55DataCompression_21]

压缩:

  • 方法1:从叶子节点开始,沿路径向上追溯至根节点,反向输出各节点对应的二进制位。
  • 方法2:创建键-值对的符号表。

扩展:

  • 从根节点开始。
  • 若当前位为 0,则向左子树移动;若为 1,则向右子树移动。
  • 若到达叶子节点,则输出该节点所代表的字符,并返回到根节点继续处理下一个位。

![image-20240405174020211]

3.2:霍夫曼编码

3.2.1:概述

![L21-55DataCompression_22]

动态模型: 针对每条消息使用自定义的前缀码进行压缩。

压缩过程:

  • 读取待压缩的消息。
  • 根据消息内容构建最优的前缀码。如何构建?
  • 将生成的前缀码(单词查找树)写入文件。
  • 利用构建好的前缀码对消息进行压缩。

扩展过程:

  • 从文件中读取前缀码(单词查找树)。
  • 读取已压缩的消息,并利用单词查找树对其进行扩展还原。

3.2.2:Java 实现:单词查找树节点

![image-20240405174719041]

edu.princeton.cs.algs4.Huffman.Node

![image-20240405175437498]

3.2.3:Java 实现:扩展

edu.princeton.cs.algs4.Huffman#expand

![image-20240405174941646]

3.2.4:Java 实现:单词查找树、编译表

edu.princeton.cs.algs4.Huffman#buildTrie

![image-20240405175922898]

edu.princeton.cs.algs4.Huffman#buildCode

![image-20240405175938985]

3.2.5:Java 实现:压缩

edu.princeton.cs.algs4.Huffman#compress

/**
     * Reads a sequence of 8-bit bytes from standard input; compresses them
     * using Huffman codes with an 8-bit alphabet; and writes the results
     * to standard output.
     * 从标准输入中读取8位字节序列; 使用具有8位字母的霍夫曼代码对其进行压缩; 并将结果写入标准输出。
     */
    public static void compress() {
        // read the input
        String s = BinaryStdIn.readString();
        char[] input = s.toCharArray();

        // tabulate frequency counts
        int[] freq = new int[R];
        for (int i = 0; i < input.length; i++)
            freq[input[i]]++;

        // build Huffman trie
        Node root = buildTrie(freq);

        // build code table
        String[] st = new String[R];
        buildCode(st, root, "");

        // print trie for decoder
        writeTrie(root);

        // print number of bytes in original uncompressed message
        BinaryStdOut.write(input.length);

        // use Huffman code to encode input
        for (int i = 0; i < input.length; i++) {
            String code = st[input[i]];
            for (int j = 0; j < code.length(); j++) {
                if (code.charAt(j) == '0') {
                    BinaryStdOut.write(false);
                }
                else if (code.charAt(j) == '1') {
                    BinaryStdOut.write(true);
                }
                else throw new IllegalStateException("Illegal state");
            }
        }

        // close output stream
        BinaryStdOut.close();
    }

3.3:demo 演示

  • 计算输入字符的频率。

![image-20240405180301604]

  • 从每个字符开始,对应创建一个节点,并赋予其权重等于该字符的出现频率。(按照权重排序)

![image-20240405180339783]

  • 找到最小权重的两个。
  • 合并成一个累计权重的单词查找树。

![image-20240405180714577]

将新的树放回原本的队列中,按照权重排序。

![image-20240405181057070]

重复以上的构建步骤,具体过程如下:

![image-20240405181146423]

![image-20240405181226901]

![image-20240405181332540]

![image-20240405181352694]

![image-20240405181407305]

![image-20240405181435345]

![image-20240405181451244]

最终构建结果:

![L21-55DataCompression_29]

3.4:小结

![L21-55DataCompression_30]

Q. 如何找到最佳的前缀码?

霍夫曼算法:

  • 计算输入字符串中每个字符 i 的出现频率 freq[i]
  • 针对每个字符 i,初始化一个节点,节点的权重设置为其频率 freq[i]
  • 重复以下过程直到形成一个单一的单词查找树:
    • 选择两个具有最小权重 freq[i]freq[j] 的节点。
    • 将这两个节点合并成为一个新节点,新节点的权重为原两个节点权重之和 freq[i] + freq[j]

![L21-55DataCompression_32]

对应书本命题 U:

![image-20240405182201039]

4:LZW 压缩算法

4.1:统计方法

![L21-55DataCompression_34]

静态模型: 应用于所有文本的固定模型。

  • 速度快。
  • 不是最优:因为各类文本具有各自的统计特征差异。
  • 示例:ASCII码、摩尔斯电码。

动态模型: 根据文本内容动态生成压缩模型。

  • 需要先进行一次预处理遍历来建立模型。
  • 在传输压缩数据时,必须同时发送模型信息。
  • 示例:霍夫曼编码。

适应性模型: 在读取文本过程中不断学习和更新模型。

  • 精确的模型构建可带来更高的压缩率。
  • 解压时需从起始位置开始解码整个文件。
  • 示例:LZW算法。

4.2:LZW 压缩

demo 演示:

![image-20240405195218117]

压缩:

![L21-55DataCompression_36]

LZW压缩:

  • 创建一张关联 W 位长度编码值和字符串的符号表。
  • 初始化 ST,其中包含单个字符键对应的码字。
  • 在输入未扫描部分中查找 ST 中最长的字符串 s,该字符串是输入的一个前缀。
  • 写出与字符串s关联的W位码字。
  • 将 s 与输入中的下一个字符 c 拼接起来,形成新的字符串,并将其添加到 ST 中。

Q. 如何表示 LZW 压缩的码表?
A. 使用一个单词查找树(Trie)结构来支持最长前缀匹配。

4.3:LZW 扩展

demo 演示:

![image-20240405200135556]

![image-20240405200147524]

扩展:

![L21-55DataCompression_38]

LZW 扩展:

  • 创建一个符号表,用于关联 W 位宽的码键与对应的字符串值。
  • 初始化 ST,填充所有可能的单字符解码结果。
  • 读取一个 W 位码键。
  • 在 ST 中查找与该码键关联的字符串值并输出。
  • 更新ST。

Q. 如何表示 LZW 解压缩的码表?
A. 使用大小为 2W 的数组来表示。

4.4:特殊情况

![image-20240405200955157]

![image-20240405201005888]

4.5:Java 实现

edu.princeton.cs.algs4.LZW

![image-20240405201101502]

edu.princeton.cs.algs4.LZW#compress

![image-20240405201120034]

edu.princeton.cs.algs4.LZW#expand

![image-20240405201135239]

4.6:小结

![L21-55DataCompression_45]

无损压缩:

  • 使用变长编码表示固定长度的符号。[霍夫曼编码]
  • 使用固定长度的编码表示变长的符号。[LZW 编码]

有损压缩: [本课程未涵盖]
· JPEG、MPEG、MP3等。
· FFT(快速傅里叶变换)、小波分析、分形等技术。

压缩的理论极限: 香农信息熵。

压缩实践: 尽可能利用所有可利用的信息。

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软文写作技巧,媒介盒子揭秘

数字化时代,想要获取用户的注意力难上加难&#xff0c;只有紧跟互联网的创作节奏&#xff0c;在软文写作中,根据用户的浏览偏好进行适当调整,让软文具有更高的审美性、易读性和启示性,才能有效地吸引当下受众的注意力。今天媒介盒子就来和大家聊聊软文写作技巧。 一、文章选题 …

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

Todesstern:一款针对注入漏洞识别的强大变异器引擎

关于Todesstern Todesstern是一款功能强大的变异器引擎&#xff0c;该工具基于纯Python开发&#xff0c;该工具旨在辅助广大研究人员发现和识别未知类型的注入漏洞。 Todesstern翻译过来的意思是Death Star&#xff0c;即死亡之星&#xff0c;该工具是一个变异器引擎&#xff…

低代码平台适合谁用?业务岗能用它做什么?开发岗能用它做什么?一文讲清!

近期&#xff0c;低代码开发平台以其独特的魅力&#xff0c;迅速引发了大众的广泛关注。众多人士纷纷寻求了解各类低代码产品&#xff0c;以探究其功能与特点。 然而&#xff0c;有些人可能因一两款产品的体验不佳&#xff0c;便对整个低代码行业产生了偏见。但我要指出的是&am…

Latex写文章时,使用.bib方式添加参考文献方法,再也不用手动调整格式了

一、背景 使用Latex写文章时&#xff0c;有的模板添加参考文献是使用\begin{thebibliography}{99}和\end{thebibliography}方式&#xff0c;如下图所示&#xff0c;这样的话得手动添加参考文献。如果参考文献多的话特别麻烦&#xff0c;其中{99}指的是参考文献条目编号的最大宽…

提示词专场:从调整提示改善与LLMs的沟通,到利用LLMs优化提示效果

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 提示词的好坏决…

多个代理proxy配置——日志查看代理后的地址

一个项目接口有两个域名&#xff0c;需要配置两个代理复制一个axios封装文件&#xff0c;修改baseUrl为新的标识 ququ新接口文件引入新的request1即可 proxy: {// 新接口采用 /ququ前缀/ququ: {target: http://192.168.2.82:8888, //鑫哥 changeOrigin: true,logLevel: debug, …

SOLIDWORKS教育版使学生了解如何加快设计项目的速度

在当今信息爆炸的时代&#xff0c;设计项目的速度和效率对于工程专业的学生来说至关重要。SOLIDWORKS教育版作为一款专门为学生设计的3D CAD软件&#xff0c;不仅提供了强大的设计工具&#xff0c;更致力于帮助学生了解如何加快设计项目的速度&#xff0c;提升他们的设计能力和…

HarmonyOS 开发-应用新功能引导实现案例

介绍 本文介绍如何使用high_light_guide三方库完成应用新版本功能导航。通过高亮区域与蒙版背景的明暗度对比&#xff0c;让用户快速锁定重点功能&#xff0c;了解版本变更和业务入口。 效果图预览 使用说明 点击页面上对应按钮或空白区域进入下一个提示&#xff0c;直至提示…

CAXA电子图版2020版 下载地址及安装教程

CAXA电子图板是一款由国内软件公司CAXA开发的专业CAD&#xff08;计算机辅助设计&#xff09;软件。它主要用于绘制和编辑各种类型的二维图纸和工程图纸&#xff0c;广泛应用于建筑、机械、电气和电子等行业。 CAXA电子图板具有以下主要功能和特点&#xff1a; 二维绘图&…

大型语言模型(LLMs)面试常见问题解析

概述 这篇文章[1]是关于大型语言模型&#xff08;LLMs&#xff09;的面试问题和答案&#xff0c;旨在帮助读者准备相关职位的面试。 token&#xff1f; 在大型语言模型中&#xff0c;token 指的是什么&#xff1f; 分词&#xff08;Tokenization&#xff09;&#xff1a;可以将…

正则问题【蓝桥杯】/dfs

正则问题 dfs 刚开始用的是栈&#xff0c;没有想到dfs… #include<iostream> #include<stack> using namespace std; string s; int pos; int dfs() {//ans表示到当前位置最多的x数目//num表示暂存的x数目int num0,ans0;while(pos<s.size()){if(s[pos](){pos;…

FireShellCTF 2020 - The Return of the Side Effect

前言 打算做几道 jsc 的 CTF 题目熟悉熟悉 jsc 的漏洞利用方式&#xff0c;但是发现很多题目都比较老了&#xff0c;commit 似乎已经没了。所以直接最新的 WebKit 上手动引入漏洞&#xff0c;然后尝试进行利用。 环境搭建 sudo apt install cmake sudo apt install ruby sud…

常用的启发式算法

1.蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;&#xff1a;想象一下&#xff0c;蚂蚁们寻找食物的过程中留下的信息素轨迹&#xff0c;就是一种高效的搜索策略。这种算法模仿自然界中的这一现象&#xff0c;适用于解决复杂的路径规划问题。 2. A*算法&…

进制转换(0123456789ABCDEF)

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {//将十进制数M转化为N进制数Scanner sc new Scanner(System.in);int m sc.nextInt();int n sc.nextInt();StringBuffer sb new StringBuffer();//1String s "0123456789…

stack: ‘FetchError: request to https://registry.npm.taobao.org/cssom failed,

npm install的时候报stack: FetchError: request to https://registry.npm.taobao.org/cssom failed, 查找了一下&#xff0c;原来是早在 2021 年&#xff0c;淘宝就发文称&#xff0c;npm 淘宝镜像已经从 registry.npm.taobao.org 切换到了 registry.npmmirror.com 解决方式&…

最长公共子序列、最长上升子序列(LCS与LIS)算法

最长公共子序列、最长上升子序列(LCS与LIS) 最长公共子序列(LCS) #include <bits/stdc.h> using namespace std; #define int long long const int N 1e39; int a[N],b[N],dp[N][N]; signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m;cin>>…

铁山靠之数学建模-基础篇

小黑子的数模基础篇 一、什么是数学建模1.1 数学模型分类1.2 备战准备什么1.3 组队学习路线1.4 赛前准备1.5 赛题选择1.5.1 赛题类型1.5.2 ABC赛题建议 1.6 学会查询1.6.1 百度搜索技巧1.6.2 查文献1.6.3 数据预处理 1.7 建模全过程 二、数模论文2.1 论文排版2.2 标题怎么写2.3…

【腾讯云 TDSQL-C Serverless 产品体验】饮水机式使用云数据库

云计算的发展从IaaS&#xff0c;PaaS&#xff0c;SaaS&#xff0c;到最新的BaaS&#xff0c;FasS&#xff0c;在这个趋势中serverless(去服务器化&#xff09; 计算资源发展Physical -> Virtualisation -> Cloud Compute -> Container -> Serverless。 一、背景介绍…

基于SSM+Vue电子竞技管理平台的设计与实现(源码+部署说明+演示视频+源码介绍+LW)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…