- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
任何人都可以用实现细节解释数据压缩的算术编码吗?我浏览了互联网并找到了 mark nelson 的帖子,但在尝试了很多小时后,我确实不清楚实现的技术。
Mark nelson对算术编码的解释可以在
http://marknelson.us/1991/02/01/arithmetic-coding-statistical-modeling-data-compression/
最佳答案
算术压缩的主要思想是它能够使用所需数据长度的确切数量来编码概率。
这个数据量是已知的,由 Shannon 证明,并且可以使用以下公式简单地计算:-log2(p)
例如,如果 p=50%,则需要 1 位。如果 p=25%,则需要 2 位。
这对于 2 的幂的概率来说已经足够简单了(在这种特殊情况下,霍夫曼编码就足够了)。但是如果概率是 63% 呢?然后你需要 -log2(0.63) = 0.67 位。听起来很棘手...
如果你的概率很高,这个属性就特别重要。如果你能以 95% 的准确率预测某些东西,那么你只需要 0.074 位来表示一个好的猜测。这意味着您将进行大量压缩。
现在,该怎么做?
嗯,它比听起来简单。您将根据概率划分您的范围。例如,如果范围为 100,有 2 个可能的事件,第一个事件的概率为 95%,则前 95 个值将表示“事件 1”,最后 5 个剩余值将表示“事件 2” .
好的,但是在计算机上,我们习惯于使用 2 的幂。例如,对于 16 位,您有 65536 个可能值的范围。做同样的事情:取范围的第一个 95%(即 62259)说“事件 1”,其余的说“事件 2”。你显然有一个“舍入”(精度)的问题,但只要你有足够的值来分配,就没有太大关系。此外,您不限于 2 个事件,您可以有无数个事件。重要的是根据每个事件的概率分配值。
好的,但现在我有 62259 个可能的值可以说“事件 1”,有 3277 个可能的值可以说“事件 2”。我应该选择哪一个?好吧,他们中的任何一个都可以。无论是 1、30、5500 还是 62256,它仍然表示“事件 1”。
事实上,决定选择哪个值并不取决于当前的猜测,而是取决于接下来的猜测。
假设我有“事件 1”。所以现在我必须选择 0 到 62256 之间的任何值。在下一次猜测中,我有相同的分布(95% 事件 1,5% 事件 2)。我将简单地分配具有这些概率的分布图。除了这次,它分布在 62256 个值上。我们继续这样,每次猜测都会缩小值的范围。
所以实际上,我们正在定义“范围”,每次猜测都会缩小范围。然而,在某些时候,存在准确性问题,因为只剩下很少的值。
这个想法是简单地再次“扩大”范围。例如,每次范围低于 32768 (2^15),您输出最高位,并将其余位乘以 2(有效地将值左移一位)。通过不断地这样做,您正在一点一点地输出比特,因为它们是由一系列猜测确定的。
现在与压缩的关系变得明显:当范围迅速缩小(例如:5%)时,您输出大量位以使范围回到限制之上。另一方面,当概率很高时,范围会非常缓慢地缩小。在输出第一位之前,您甚至可以进行大量猜测。这就是将事件压缩到“一点点”的原因。
我特意使用了“概率”、“猜测”、“事件”等术语来使本文保持通用。但是对于数据压缩,您只需将它们替换为您想要的数据建模方式即可。例如,下一个事件可以是下一个字节;在这种情况下,您有 256 个。
关于algorithm - 数据压缩 : Arithmetic coding unclear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10141053/
code
正常吗?
我刚刚开始使用 YARD 来记录我的 Rails 应用程序。我没有指定任何特定的标记处理程序,但我希望 `code` 会转换为 code,但这似乎没有发生。这是正常行为吗?我是否必须添加一些额外的选项
什么是Code-Server 首先程序员朋友们肯定都用过来自微软的VS Code 这款轻量而又高级的编辑器,拥有丰富的插件库,支持各种语言编译运行。而本文介绍的Code-Server就是coder 公
我是一名高中生,今年开始学习汇编。 我目前正在制作 Pacman 克隆作为我的最终项目。 我遇到的唯一问题是我的代码很大,*.exe 文件几乎有 64KB。 所以我的问题是,如果我转向模型介质,我需要
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 挑战 按字符计数绘制 Code 39 条码的 ASCII 表示的最短代码。 维基百科关于代码 3
我正在开发 VS 代码的扩展(使用 javascript)。现在我需要安装 VS Code 的路径。 windows有一种方法: var child = require('child_process'
[Windows 10] 我在自定义目录中安装了“Microsoft VS Code(用户设置)”,每当我尝试更新它时,都会显示: 然后这个 Log Info Dec 23 11:42:40.673
我正在尝试更新我的 VS 代码,但收到一条错误消息:由于防病毒软件和/或进程失控,更新可能会失败。 附加了一个来 self 的用户的日志文件,但我不确定要检查什么。我对计算机和编程还是个新手。 最佳答
几天前我安装了 Kali Linux。我正在尝试使用 Code-OSS 而不是 VSCode,因为最新版本的 Kali 没有安装普通版本所需的库。 如果我尝试使用 code-oss . 或 code
我正在从 Atom 迁移到 VS Code,因为这似乎是当今所有酷 child 都在使用的东西。 在 atom 中,我能够如图所示突出显示当前行号(装订线中的蓝色突出显示)。 有没有办法在 VS Co
我试图找到一个明确的 G 代码语法规范,而不是单个 G 代码的含义,我无处不在的规范,我的意思是详细的语法规范,目的是编写解析器。 我编写解析器没有问题,我只是在寻找语法规范,例如。我知道您不必总是为
我想在 VS Code (Windows) 中使用 Fira Code,并且已经按照 instructions 中的说明配置了字体。 。不知何故,字体看起来很模糊。我该如何解决这个问题? "edito
这个问题已经有答案了: How can I navigate back to the last cursor position in Visual Studio Code? (16 个回答) 已关闭
如何选择当前单词,即插入符号所在的位置。 注意:我正在寻找 Visual Studio Code(VS Code)(文本编辑器)的快捷方式,而不是 Visual Studio IDE。 最佳答案 在
我需要在 VS Code 中安装 flutter 但在安装扩展中,我有这个错误 Unable to install 'Dart-Code.flutter'; there is no available
memberData
有什么区别
{@code memberData} 和有什么区别?和 memberData在 JavaDoc 中 最佳答案 有两个主要区别: {@code ...}更简洁:更易于阅读(和输入)。 {@code ..
我有这样一个字符串: Here is my code sample, its not too great: [CODE] [/CODE] I hope you enjoy. 现在我想用 highli
在 VS Code 中,我有一个少于 50 个文件的 Vue 项目,但是在运行开发服务器时 VS Code 抛出 Error: ENOSPC: System limit for number of f
Source Code Pro 如何在 VSC 中使用 ExtraLight ~? 似乎以下不起作用...... 我确定我有字体。 Source Code Pro ExtraLight 最佳答案 编辑
我对 Visual Studio Code 很陌生。我正在尝试调试一个已经存在的应用程序,我已经通过 Git 克隆了它。我的文件都没有被修改。我已经下载了微软扩展“C# for Visual Stud
Visual Code VS Visual Studio Code Insider 我还是不明白这两者有什么区别,难道其中一个是新功能的试用版吗? 最佳答案 Visual Studio Code In
我是一名优秀的程序员,十分优秀!