读数据压缩入门笔记02_二进制和熵

这篇具有很好参考价值的文章主要介绍了读数据压缩入门笔记02_二进制和熵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读数据压缩入门笔记02_二进制和熵文章来源地址https://www.toymoban.com/news/detail-464103.html

1. 十进制

1.1. 现代数学建立在十进制计数系统之上

2. 二进制

2.1. 二进制计数系统的工作原理与十进制计数系统一样,唯一的区别是前者的基数为2,而后者的基数为10

2.2. 数据压缩所做的就是尽可能减少表示特定数据集时所需的二进制位数量

2.3. 给定任意一个整数,我们都能将它转换为二进制形式

3. 十六进制

3.1. 用字母A来表示10,用B表示11,以此类推,用F表示15

4. 信息论

4.1. 一个数值所包含的信息内容等于,为了在一个集合中唯一地确定这个数值,需要做出的二选一(是/否)决定的次数

5. 二分查找

5.1. 首先将数组中的数据集分成两半,然后判断要找的数值10比处于中间位置的枢轴值是大还是小

5.2. 如果一个数组包含偶数个元素,那么真正处于中间的元素是不存在的,可以根据喜好冲中间偏左或者偏右选择一个

6. 熵

6.1. 物理学中的解释

6.1.1. 一个热力学量,表示的是一个系统中无法转换为机械功的热能的量,通常被解释为该系统的无序度或随机度

6.2. 信息论中的解释

6.2.1. 对在特定的消息或语言中信息传输速度的一种对数度量

6.3. 表示一个数所需要的最少二进制位数

6.4. 一个数所需要的二进制位数lb(x)=(log(x)/log(2))

6.4.1. 二进制位已经是数据的最小单位,能使用的最小的二进制位数就是1

6.4.2. 必须对这个值向上取整,也就是使用向上取整函数,即ceil(或ceiling)函数

6.5. LOG2(x)=ceil(log(x+1)/log(2))

6.6. 一个集合的熵

6.6.1. H(S)=-∑pi×lb(pi)

6.7. 为了使表示某个数据集所需的二进制位数最少,数据集中的每个符号平均所需的最小二进制位数就是熵

6.8. 以一种倒排序的方式建立在数据流中每个符号出现概率的估算之上的

6.8.1. 一个符号出现得越频繁,它对整个数据集包含的信息内容的贡献就会越少

6.8.2. 很长的时间里没有什么有用的信息,真正有用的信息偶尔才会出现

7. 数据压缩算法的艺术

7.1. 真正试图去突破熵的限定

7.2. 将数据转换成一种熵值更小的、新的表现形式

8. 突破熵

8.1. 按照香农对熵的定义,他只考虑了符号出现的概率,完全没有考虑符号之间的排序

8.1.1. 对真实数据集来说,排序是一项基本的信息,符号之间的关系同样如此

8.2. 通过利用数据集的结构信息将其转换为一种新的表示形式,而这种新表示形式的熵比源信息的熵小

8.2.1. [Q,U,A,R,K] 和[K,R,U,Q,A] 这两个集合有相同的熵

8.2.2. [Q,U,A,R,K] 这个集合表示的是英语中一个有意义的单词

8.3. 增量编码(delta coding)

8.3.1. 如果相邻的值之间高度相关,那么用增量编码的方法可以转换数据,使其熵变得更小

8.3.2. 顺序很重要

8.4. 符号分组

8.4.1. 用单词作为符号,得到的熵值会更小

8.4.2. 如果数据集中存在连续值组合出现多次的情况,就可以利用这种情况来减小熵

8.4.3. 通过最佳符号分组预处理数据,会得到一个较小的熵值

8.5. 排列

8.5.1. 一个排列就是原来的集合打乱顺序后的一个版本

8.5.2. 对数直接进行编码时,共需要24个二进制位,而对下标编码时,只需要18个二进制位,也就是节省了大约25% 的空间

9. 标准的数字长度

9.1. 用最少的二进制位数来表示一个数,在解码相应的二进制字符串时会产生混乱(因为我们并不知道该数对应的LOG2长度),会与硬件的执行性能相冲突,两者不能兼顾

9.2. 折中的方案

9.2.1. 用固定长度的二进制位数来表示大小不同的整数

9.2.2. 最基本的存储单元是一个字节,由8个二进制位组成

9.3. 信息论与实际实现层面的差别

9.3.1. 绝大多数算法使用预先设定好的固定的二进制位长度,而不是通过LOG2函数计算出的二进制位长度

10. 柯尔莫哥洛夫复杂性

10.1. Kolmogorov complexity

10.2. 以数学家安德雷•柯尔莫哥洛夫(Andrey Kolmogorov)的名字命名,以纪念他在1963年发表了这方面的第一篇论文

10.3. 度量的是确定一个对象所需要的计算资源

10.3.1. 为了准确地生成数据,所需要的生成程序的大小

10.4. 任何字符串的柯尔莫哥洛夫复杂性顶多比字符串本身的长度大几个字节(基本上,也就是一个程序输出字符串的每个元素)

10.5. 逻辑综合(logic synthesis)或者程序综合(program synthesis)进行数据压缩的时候,柯尔莫哥洛夫复杂性就开始真正起作用了

10.5.1. 本质上它取的是数据集以及反向生成产生字符串的程序的二进制位流

到了这里,关于读数据压缩入门笔记02_二进制和熵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#对象二进制序列化优化:位域技术实现极限压缩

    目录 1. 引言 2. 优化过程 2.1. 进程对象定义与初步分析 2.2. 排除Json序列化 2.3. 使用BinaryWriter进行二进制序列化 2.4. 数据类型调整 2.5. 再次数据类型调整与位域优化 3. 优化效果与总结 在操作系统中,进程信息对于系统监控和性能分析至关重要。假设我们需要开发一个监控程序

    2024年01月22日
    浏览(45)
  • 【Unity】二进制文件 数据持久化(修改版)【个人复习笔记/有不足之处欢迎斧正/侵删】

             变量的本质都是二进制 ,在内存中都以字节的形式存储着,通过sizeof方法可以看到常用变量类型占用的字节空间长度( 1byte = 8bit,1bit(位)不是0就是1 )         二进制文件读写的本质: 将各类型变量转换为字节数组,将字节数组直接存储到文件中 ,不仅可以节

    2024年04月17日
    浏览(49)
  • Python基础入门之二进制的负数

    刚刚介绍了位运算符,里面涉及到了二进制的运算,出现了a = 60,~a = 1100 0011 = -61的计算,所以这里记录一下二进制的负数表示和计算。 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。 它的基数为2,进位规则是“逢二进一”,借位规则是

    2023年04月09日
    浏览(39)
  • 将数据转二进制流文件,用PostMan发送二进制流请求

    一、将byte数组转二进制流文件,并保存到本地 byte [] oneshotBytes=new byte[]{78,-29,51,-125,86,-105,56,82,-94,-115,-22,-105,0,-45,-48,-114,27,13,38,45,-24,-15,-13,46,88,-90,-66,-29,52,-23,40,-2,116,2,-115,17,36,15,-84,88,-72,22,-86,41,-90,-19,-58,19,99,-4,-63,29,51,-69,117,-120,121,3,-103,-75,44,64,-58,-34,73,-22,110,-90,92,-35,-18,-128,16,-

    2024年02月15日
    浏览(42)
  • FPGA 学习笔记:Vivado simulation 仿真波形二进制显示

    最近在学习FPGA,发现除了烧写到FPGA上验证功能,最有效的方式就是软件仿真 软件仿真:simulation,就像是模拟器一样,写好测试用例,然后看是否可以输出想要的结果,用于验证FPGA逻辑的准确性 当前仿真成功后,还是需要真机实测验证 当前安装了好几个版本的Vivado ,当然

    2024年02月12日
    浏览(54)
  • 【FPGA仿真】Matlab生成二进制、十六进制的txt数据以及Vivado读取二进制、十六进制数据并将结果以txt格式保存

    在使用Vivado软件进行Verilog程序仿真时可能需要对模块输入仿真的数据,因此我们需要一个产生数据的方法(二进制或者十六进制的数据),Matlab软件是一个很好的工具,当然你也可以使用VS等工具。 以下分别给出了使用Matlab模拟产生二进制和十六进制数据的例子,例子仅供参

    2024年02月01日
    浏览(57)
  • C语言二进制数据和16进制字符串互转

    知识点:结构体中的“伸缩型数组成员”(C99新增) C99新增了一个特性:伸缩型数组成员(flexible array member),利用这项特性声明的结构,其最后一个数组成员具有一些特性。第1个特性是,该数组不会立即存在。第2个特性是,使用这个伸缩型数组成员可以编写合适的代码,就

    2024年02月13日
    浏览(45)
  • 使用 WebSocket 发送二进制数据:最佳实践

    WebSocket  技术提供了一种在客户端和服务器间建立持久连接的方法,使得双方可以在打开连接后随时发送数据,而不必担心建立复杂的持久连接机制。同时,使用二进制数据,如ArrayBuffer,可以更有效率地传送图像、声音等信息。本指南旨在深入探讨如何使用WebSocket传输二进

    2024年04月09日
    浏览(44)
  • Python读取SD卡二进制数据

    在我们使用 STM32 或者 FPGA 采集数据的时候,需要将数据存储到SD卡中,因为数据是按照地址存储的,并且没有文件结构,所以不能直接用电脑的文件管理器读取,下面是一种读取数据的办法 正点原子 STM32F407ZG 探索者 运行完此代码后,将会在当前文件夹里面生成一个 output.b

    2024年02月07日
    浏览(38)
  • JS中的常见二进制数据格式

    格式 描述 用途 示例 ArrayBuffer 固定长度的二进制数据缓冲区,不直接操作具体的数据,而是通过类型数组或DataView对象来读写 用于存储和处理大量的二进制数据,如文件、图像等 let buffer = new ArrayBuffer(16); TypedArray 基于ArrayBuffer对象的视图,提供特定格式的读写接口 用于操作

    2024年04月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包