字幕组成品列表(Beta)
  • 写在前面
  • Android 平台
    • Game On! 游戏开发系列 - 031
      • Pie Noon - 1503060393
      • The Death of Base Game Activity - 1504030543
      • Surviving OpenGL Context Loss - 1504030546
      • WebP for Game Devs - 1504030547
      • Saved Games In-Depth (Part 1) - 1504070556
      • Saved Games In-Depth (Part 2) - 1504030548
      • Smaller Flipbook Textures with CRABBY - 1504030544
      • Google Tag Manager - 1504030545
      • Flatbuffers - 1505050794
      • Achievement Point Pointers - 1505050796
      • Frequency Scaling - 1505050797
      • Meet the Management APIs - 1501140367
      • Y U Ship Broken Games - 1505050795
    • Android 性能优化 - 088
      • Garbage Collection in Android - 1503170425
      • Performance Cost of Memory Leaks - 1503170424
      • Rendering Performance 101 - 1501130351
      • Understanding Overdraw - 1501130352
      • Understanding VSYNC - 1501130353
      • Tool - Profile GPU Rendering - 1501130354
      • Why 60fps? - 1501130355
      • Android UI and the GPU - 1501130356
      • Invalidations, Layouts, and Performance - 1501130357
      • Overdraw, Cliprect, QuickReject - 1501130358
      • Tool - Memory Monitor - 1501130363
      • Battery Performance 101 - 1501130364
      • Understanding Battery Drain on Android - 1501130365
      • Battery Drain and WakeLocks - 1501130366
      • Memory Performance 101 - 1504170661
    • I/O 2014 Android 开发专题 - 089
      • Activity Transitions - 1504020505
      • Building Apps For Android TV - 1504020520
      • Building great Android media experiences - 1504020510
      • Building a quality app from start to finish - 1504020515
      • App Indexing API - 1504020507
      • What's new in WebView - 1504010484
      • Bluetooth Low Energy - 1504010486
      • Building impressive Android media experiences - 1504010493
      • The next Generation of Authentication - 1504020497
      • Don't Alpha That Pixel! - 1504020523
      • NFC + HCE Your phone in an interactive world - 1504020509
      • Demystifying encodes and decodes of WebM - 1504020521
      • Google Cloud Messaging - 1504020524
      • Getting your Game on the Big Screen - 1504020518
      • I hear you like realtime memes - 1504020511
      • Offerize your App - 1504020506
      • Using the Android Job Scheduler - 1504020504
      • From Holo to Material - 1504020526
      • Under the Hood of Android Auto - 1504020501
      • Isolation for Android App Developers - 1504020498
      • Android Work - 1504010496
      • ExoPlayer: Adaptive video streaming on Android - 1504010489
      • Sample rates and resampling: Why can't we all just agree? - 1504010488
      • Drive Android API - 1504010485
    • Android Studio - 004
      • Layout Editor (Ep 3, Android Studio) - 1503290479
      • Introducing Gradle (Ep 2, Android Studio) - 1503170426
    • I/O 2014 Android 分发主题 - 091
      • Introduction to Google Play - 1504030534
      • Google Play: building your user community - 1504030535
      • Optimizing Apps for Education - 1504030536
      • Succeeding in Education Technology - 1504030530
      • Subscriptions Made Easy with Google Play - 1504030531
      • The world is your playground - go global with Google - 1504030533
      • Maximizing discoverability on Google Play - 1504030538
    • Android Auto - 003
      • Introduction to Android Auto - 1504130615
      • Android Auto Messaging - 1504130617
      • Android Auto Audio - 1504130616
    • Android Wear - 006
      • Designing for Android Wear - 1503210448
      • How We Customized Google Apps for Android Wear - 1503210450
      • Fullscreen apps for Android Wear - 1503210445
      • New Notification Features for Android Wear - 1503210446
      • Building Cloud-powered wearable Apps - 1503210449
      • An Introduction to Android Wear - 1503190435
      • Google I/O 2014 - Android Wear: The developer's perspective - 1503210442
      • Devoxx 2014 Interviews: Android Wear - 1503210440
      • DevBytes: Watch Faces for Android Wear - 1503210439
    • Android TV - 005
      • Using the Leanback library - 1504080588
      • Beach Buggy Racing Multiplayer with Nearby Connections (Play Services) - 1503060387
    • Android for Work - 106
      • Android for Work for Developers - 1503060390
      • App Configurations, Testing and Launchers - 1504110590
    • IO Bytes 2014 - Android - 066
      • Chrome Apps on Android and iOS - 1501080014
      • Perf Primer CPU, GPU and your Android game - 1501080017
  • Chrome 平台
    • IO Bytes 2014 - Chrome and Web - 067
      • Using the PageSpeed API - 1505070815
      • Fabulous Forms for the multi-device web - 1505070816
      • Testing multi-screen web pages - 1505070817
      • Responsive images today - 1505070819
      • Web Performance Testing at YouTube - 1505070828
      • Building sites for the multi-device web - 1505070820
      • Deep dive: Google Cloud Messaging for Chrome - 1505070827
  • Google 创业者资源
    • Coffee with a Googler - 012
      • Chat with Allen Huang of AndroidTV - 1503040384
      • Chat with Fred Chung about developer advocacy - 1503070395
      • Google Fit platform with Michelle Haq - 1503210443
      • Android Auto Product Manager Andrew Brenner - 1501120027
      • Chat with Francis Ma about Google Play services - 1501120028
    • Root Access For Startups - 077
      • What we learned building plug-ins for Android, with startup Magnet - 1503230453
      • How to use crowdfunding to your advantage, with startup Hale Devices - 1503280462
      • How to overcome customer objections when selling tech, with startup Guesswork - 1503280458
    • First Things First - 029
      • Getting started with Android: A crash-course in developing for Android - 1504120601
      • How to ask a question: conducting research for your startup - 1504120603
      • MVP Design Hacks: transform your hot idea into a validated prototype - 1504120602
      • Build something people want: Solving real problems - 1504120605
    • How I - 061
      • Use BigQuery to find my most valuable customers - 1504070573
      • Manage beta testing communities using Google Play - 1504070572
      • Use paper wireframing to build native prototypes - 1504070570
      • Used social media and $0 marketing to get 68 million users - 1504070568
      • Prep to fundraise with four questions - 1504070564
      • Validated my idea in 2 days (with no code) - 1504070562
      • Build open platforms on Android - 1504120596
      • Get cheap, automatic analytics for my business using BigQuery - 1504070571
      • Write press releases to get international media coverage - 1504070569
      • Test beta-product features using Google Apps - 1504070563
      • Use URL builder to measure ROI on social media - 1504070561
      • Use events to build DeadSocial's brand - 1504070557
      • Use BigQuery to visualize streaming data - 1503220452
      • Find, screen, and hire developers - 1503120406
      • Drive engagement with social challenges - 1504070558
  • 设计
    • DesignBytes - 017
      • Paper and Ink: The Materials that Matter - 1505050793
  • 云计算
    • DevBytes: Google Cloud Platform - 021
      • Powering the next killer app with the Google Cloud Platform - 1504210672
      • Introduction to Google Cloud Endpoints - 1504210675
      • The Beauty of Scale with Google Cloud Platform - 1504210678
    • Google Cloud Platform - Big Data - 105
      • GDELT & BigQuery: Understand the world - 1502200379
    • Uncategorized - 999
      • Introducing Google Cloud Platform Resources - 1501190370
  • Google 应用开发
    • Launchpad Online - 072
      • The Setup: Creating new apps using Google APIs - 1503190428
      • Listing your files in Google Drive - 1503190429
      • Customizing Google Analytics for your startup - 1503290473
      • The Launchpad Online series - 1503190427
      • Getting started with Google Analytics - 1503290472
      • Accessing Google Maps from a spreadsheet?!? - 1502220381
      • Change the world in 10 lines of code - 1503080398
    • Google Play Services - 054
      • Google Play services 6.1 - 1503290481
      • Google Play Services 7.0 - 1503200437
      • Google Play Services 6.5 - 1501080015
    • 谷歌地图 iOS SDK - 053
      • Maps Live: New Features in the Google Maps Mobile APIs for Android and iOS - 1504300777
    • Google 移动搜索开发 - 055
      • Is your app in the Google index? - 1504120598
      • Get more engaged users with Google Search for Developers - 1503070397
    • DevBytes: Google Cast - 020
      • Google Cast SDK for Android - 1504180666
      • Media Router Framework - Part 1 - Media Router API - 1504180667
      • Overview for Google Cast Receivers - 1504180664
      • Google Cast SDK for iOS - 1504180663
    • Getting Started with the Google Maps SDK for iOS - 035
      • Getting started with the Google Maps SDK for iOS, Part 1 - 1504270757
    • IO Bytes 2014 - Wearables - 070
      • Voice Driven GDK Glassware - 1505280836
    • Route 85 - 078
      • Introducing Route 85 - 1501120022
      • Quick Tip: Don't Default that Switch! - 1501190371
      • OpenInChrome on iOS, Part 1 - 1501120023
      • OpenInChrome on iOS, Part 2 - 1501120024
      • OpenInChrome on iOS, Part 3 - 1501120025
      • OpenInChrome on iOS, Part 4 - 1501120026
    • DevBytes 2014 - 019
      • Web Components - Template - 1505040789
      • Wearable DataLayer API - 1505050792
      • Using srcset for responsive images - 1505050790
      • The picture element for art direction - 1505050791
    • Uncategorized - 999
      • Sun Surveyor brings augmented reality to photographers using Google Maps APIs - 1504200668
      • Snappy travels with the Roads API - 1503060392
      • Easy Maps Apps in Java and Python - 1501140030
  • Google 广告平台
  • Polymer
    • Polycasts - 076
      • The Awesome Power of Auto-Binding Templates -- Polycasts #08 - 1502220382
      • Content Switcheroo with Core-Pages -- Polycasts #09 - 1502200380
      • Core Iconset -- Polycasts #02 - 1505040788
  • Web 平台
    • HTTP 203 - 062
      • Gotchas - 1501140368
      • Font Rendering - 1501080016
    • Web Components - 081
      • DevBytes: Web Components - Overview - 1504250709
  • 宣传视频
    • Uncategorized - 999
      • Google Developers - 1501150369
      • I/O Extended 2014 - Join me - 1502220383
  • Google 各类开发者会议
    • 2014 Chrome 开发者高峰会议 - 009
      • Keynote - Chrome Dev Summit 2014 (Darin Fisher) - 1503120407
      • TLS All the Things! - Security with Performance(Chris Palmer) - 1503140412
      • Let’s build some apps with Polymer!(Rob Dodson) - 1503150415
      • Day One Closing Remarks(Sundar Pichai) - 1503150417
      • Chrome Leadership panel - 1503160422
      • Fundamentals of Mobile Web Development(Matt Gaunt) - 1503150416
    • 2015 游戏开发者大会中 - 039
      • FlatBuffers - 1504150640
      • Games for Google Cast - 1504150637
      • Top 10 Things Android Game Developers Should Know v 3.0 - 1504150643
      • Automate Publishing for Google Play APIs - 1504150639
      • 3 Game Design Mistakes You're Making - 1504150636
      • Android TV - 1504150638
      • How to Go Viral Without Really Trying - 1504150641
    • Devoxx 2014 Interviews - 024
      • What's new in Android 5.0 Lollipop - 1504260740
      • Android Tools - 1504260743
      • BigQuery and user-defined functions - 1504260744
    • IO Bytes 2014 - 065
      • Dart in Google Cloud - 1505070810
      • Big genomic data on Google Cloud Platform - 1505070811
      • Easy International Checkout with Chrome - 1505070802
      • Google developer tools and APIs for iOS - 1503190436
      • Whet your appetite with IO Bytes - 1501080021
    • PlayTime@Shanghai - 095
      • 主题演讲 Chris Yerga - 1504060549
      • 如何成功地开发你的应用 Ellie Powers - 1504060550
      • 在Google上营利 Brahim Elbouchikhi - 1504060551
      • Playtime Shanghai event sizzle reel - 1504070552
    • Project Google I/O 2015 - 098
      • Project Tango Mobile 3D tracking and perception - 1506120857
      • Democratizing Education - 1506120868
      • Improve your Android app’s accessibility - 1506120864
      • Google Cloud Messaging 3.0 - 1506120844
      • Developers connecting the world through Google Play - 1506120862
  • 开源开放技术
    • Compressor Head - 013
      • The Trailer, Season 2 - 1503060385
      • Behind the Scenes - 1503210441
      • Arithmetic Compression (Ep 5, Compressor Head) Google - 1503070394
      • Introducing Compressor Head - 1502120372
      • Episode 1 (Variable Length Codes) - 1502120373
      • Episode 2 (The LZ77 Compression Family) - 1502120374
      • Episode 3 (Markov Chain Compression) - 1502120375
Powered by GitBook
On this page
  • 译者信息
  • 解说词中文版:

Was this helpful?

  1. 开源开放技术
  2. Compressor Head - 013

Episode 3 (Markov Chain Compression) - 1502120375

PreviousEpisode 2 (The LZ77 Compression Family) - 1502120374

Last updated 5 years ago

Was this helpful?

视频发布时间

2014年5月20日

视频介绍

Markov Chains Compression sits at the cutting edge of compression algorithms. These algorithms take an Artificial Intelligence approach to compression by allowing the encoder and decoder to 'predict' what data is coming next. In this episode Colt McAnlis talks about how these magical algorithms compress data, and why some think that they are the future of compression.

视频推介语

暂无,待补充。

译者信息

翻译

润稿

终审

原始链接

中文字幕

翻译流水号

加入字幕组

周亿

——

——

1502120375

解说词中文版:

嗨 时髦的硅谷大叔

你在研究什么

呃 我在一个新的手机应用的想法

牛 赞一个

这么说你已经找到投资公司

很不错嘛

是奇思妙想设计网站公司

BING 猜对了

我迫不及待想看看你的协作智能算法

怎样帮助用户找到 啊 不是

你不是做这个的啊

呃 那个 我敢说你的压缩算法

很赞

我是说 压缩向第三世界国家传输的数据

信息的大小

不 也不是这个第三

好吧 那你会压缩的哪一块

你知道 今天是个重要的日子

不会 什么都不会

好吧 听着

别灰心

这还不算太糟

我是说你还可以做些弥补

你所需要做的就是

在马尔科夫链上下工夫

而且你分分钟就实现了压缩了

你懂的 马尔科夫链

从数学角度

在一个空间把一种状态转换到另一个状态

通常被认为占用很少内存

这种状态取决于目前的情况

而不是事件发生的顺序

使得应用能够遵循现实世界

统计模型的过程

不行

还是不会

你知道么

也许我们应该从头开始

但是不要害怕 年轻的硅谷嬉皮士

我就是来帮忙的

我是Colt McAnlis 这里是压缩头

瞬间移动 开始

现在我空余时间最喜欢做的事之一

就是提炼美国的伟大传统

并将它们绘制成图表

就拿棒球来说吧

虽然它看似一系列随机的动作

一对赢一队输

这事实上是个很简单的图表

我们来看一看 当一个击球手来到场地

他在这个地方击球

这时候只有两种情况

第一种 他可以用棒挥击 推击

或其他方式把球打出

或者是上垒

这个游戏最有趣的部分是

一旦你跑起来

无论你有没有上垒 那么你都得回去

然后另一个队员上场

最牛的是这些道理都是

显而易见的 不是么

在他们之间只有三种情况和两种转换

但如果我们想要通过这个图表把一些运动

传达给另一个人会怎么样呢

举个例子 击球手们上场 下场

然后上垒了

再来一次 然后又有一个下场

我们一直都在做的也是最简单的事情

就是假设每种情况是有限的符号

我们可以用两个字节来为每个符号编码

也就是说 我们有1 2 3 4 5 6

每一个符号占两个字节

即若我们想把这个发给某人

那么它的整个流量是大概12个字节

但是如果我们仔细观察

也许会有更好的方法来解决

如果我们不把每种状态指定为

可变字节长度

而是在每种状态转换之间指定字节编码

比如说 我们把0 1 0 0

放在这四个地方

这样 我们就能编码不同状态

之间的互相转换

只要编码器和解码器了解这些状态以及

我们在各个状态之间是怎样运行的就行了

如果这个假设成立的话

也就是说我们在对这种状态

进行编码

我们可以在5个字节内完成整个

流程的编码 这是不是很棒呀

但是我认为我们可以做的更好

你在看看我们这儿的这张图表

我们知道棒球的有些规则

是含蓄隐藏式的

我们不需要去编码

例如 一个击球手不管是上场还是下场

无论如何另一个击球手

也是要上场的

所以我们不需要这个流程中为他们编码

因此我们可以擦掉这个和这个

也就是说我们真正需要编码的唯一信息是

一个棒球队员上场

他是出场还是上垒

这个信息使得我们能够编码所有的符号数据

仅仅需要三个字节

所以从12个字节压缩到3个字节是至关重要的

我们这里所说的去编码状态间的转换

而不是编码每个具体的状态

并且某些状态是隐藏在

编码器和解码器的里的

也就是马尔科夫链的基本工作原理

但是这只是一个简单的例子

实际上要比这复杂的多

在1913 A A Markov通过数学和诗歌

发现了概率的一个新分支

Markov 花费了数小时

选择普希金文章中的

元音和辅音 模式

并于1913年1月23日发布了模型的详细说明

给定一个字母

那么它的下一个字母的概率

是一个有限的可循环的概率

你看大多数的时候 Markov是一个

非常爱管闲事的人 经常参与政治争斗

公众抗议

他在他的任何领域都喜欢和人竞争

事实上他花了很多的时间

在监狱大抡拳头

无论怎么说这个算法的发明者

现代硅谷的开创者

都不能诋毁他的功绩

你看 Markov的概率事件理念

严重的违背了当时的统计界

特别是抛掷硬币

投掷筛子

核心的是 马尔科夫链

帮助我们解决了关系概率的很多问题

比如 今天是下雨

那么两天之后下雨

下雨的概率是多少

在1913年 预测数学被当做

鸡肋

你能想象么

而今天马尔科夫链却是硅谷一些最大最复杂的大数据

算法的重要组成部分

这些从癌症研究到天气预报

再到模拟消费者行为

随处可甚至是能找出

圣何塞最美味的披萨

而最好的是 我们能够使用同样的算法

来组成这些大的算法或者是用来压缩

让我们来看一看

使用Markov 的理论 我们能够通过专注于

一个字母之后出现任何字母的这种转换关系

编码的一个字符串

这儿我们为了简便

我将把每组符号转换从新画成

一颗树的形状 每组中的第二个字母

作为树干第一个字母

作为子节点

为了给这个主题一个更好的术语解释

我们把每一组上下两个字母指定为从0开始的顺序

第一个字母用0表示

那么接下来的字母就用1表示

你们中专注画图的那些人

会问T与N同是指向0 为什么不都作为

第一组的子节点呢

对于用符号0 来表示每一组

确实0是接下来的字母

但事实上这么做事错的

我来告诉你们为什么

为了明白为什么 我们用简单的三个步骤

来给这一行字母从新编码 又叫二阶文

使用你的想法 来展示一阶文

现在 虽然这棵树看起来很有视觉震撼效果

非常讨人喜欢但它表示字符串构建却

表示的相当不准确

比如 这个图

允许你从T到一阶的0

然后从0到二阶的T 这样组成TOT

但实际上输入数据中却不存在

这当然就是错误的做法

正确的做法是把文章的转换

不共享

现在让我们向前延伸一下

看看在更长一些的字符串中如何使用一阶文

也就是每两个字符一对

你可以看到一个更真实的例子

改变了我们的分支 给了我们一个

不同的更错综复杂的

关系排列树 比如T, O和E

之后有多个

后续字母

如果我们要对这个例子编码

我们需要对这些

上下关系进行编码分配

问题是我们给一个关系

分配多少位呢

我们可以使用这些关系中所需要最大 的那个

在这个例子中 0阶中的0

有三个转换 但就是说

我们可以用2位来描述所有关系

当然 这样做有一些浪费

比如 我们只有一个转换关系的

不需要两位来描述

另外 每个节点我们还需要一些数来让

编译器知道有多少为需要读取

如果每个节点有16种关系而不是

两种会怎么样呢

正确是使用变长码来描述

这些关系

这样 用来描述关系的密码长度

就是可变的

具体的是由实际需要决定的

记住 可变长码要给可能性

最大 的分配短的编码

为了使压缩程度最大化

我们在分配密码时

必须把概率考虑在内 不过还好

在我们构建链的时候还是很容易实现的

这样做使得我们能够使用可变长码来正确进行编码

这样一个容易出错的地方

就是每个字符转换

从0阶到1阶的每个子分支

都有它自己的概率表

同样的 也有它自己的变长码

需要说明的是 你不是在根据

整个图建立变长码

不 不是

那样是错的

这 这些年出现了

巨大的马尔科夫链

比如 由Google开创者Larry Page和

Sergey Brin设计的Page Rank算法

就是基于马尔科夫链 其状态是

世界范围的网站页面 也许有400亿那么多

这些状态之间的转换

实际上就是页面之间的 链接

这个算法的目标就是弄清楚一个读者从一个链接

随机到达其他页面

每一个页面的具体概率是多少

为了使马尔科夫实际应用于压缩

我们需要更多地从科技眼光看问题

对于马尔科夫链来说

熵值和实际的实现方法

是完完全全不一样的

可惜的是

我不会这么说

让我们实际动手

看看具体是怎么回事

马尔科夫的效率很高 但是对于压缩

它 有一个巨大的缺陷

假设你想要对这个编码方式设计解码器

对于每个文本转换或者是父亲到儿子

的转换 你需要储存一个频率表

也就是字符和他对应的频率

这个数据也需要

在压缩数据中 这样解码器

才能正确解码

但是即便是对于这个简单的例子

这个过程的开销也是很大的

必须存储所有的频率数据

这样解码器才能够解码

对于这个流我们需要53字节

而原字符串才22字节

所以明显这么做一点用都没有

甚至变得更糟糕了 我们的数据更大了

或者是我们需要保存的文本更多了

重点是我们不能简单的把编码器的

百分比拿到解码器来解码数据流

我们需要把这 整个过程作为解码器

这样解码器解码数据将会产生

和编码器数据一样的

统计特性

假设我们要解码这个流

动态生成概率

同时马尔科夫链进行编码

我们从一个空的马尔科夫数据集开始的

我们从流中读取第一个字母 A

我们需要对它编码

不过我们不能编码 因为目前我们没有可用数据

因此 我们需要创建我们的树

树创建好了以后

我们需要用变长码对 A 进行编码

但是我们还是不能

因为我们一步需要分配给他概率

因为这是我们见到的第一个字母

我们给他100%

一旦我们有了概率 我们能够建出哈夫曼树

这样我们就能给字符 A 分配编码

因为我们的树里没有其他的东西

所以编码是0

我们开始读取第二个字母 B

我们依旧是第一次见到

我们需要把它作为一个符号按照它的概率

加入我们的树中

这时我们同样要更新我们文本中的

其他字符的概率

这是我们第二次看见 B

更新它在表中的概率

并且和A交换编码 这也是我们想要的

动态的更新概率

根据概率产生变长码

最棒的是我们不用转换流概率

只用编码就好了

然而我们尝试解码这个

我们就遇到了一个大问题

我们没有任何关于这些文字的信息

或者是用来构成二进制流的概率表

也就是说我们不能解码这个流

这不是你哥正确的编码

为了弥补这个 我们不得不

从新审视编码器 找到一个

正确的方法来输出文本 这样解码器就能够

实用他们来重构原始数据

我们第一次将 A 加入树的时候

我们需要想办法将 A 输出到编码流

这样我们的解码器就能够得到它

为了实现这个 我们增加一个新的流叫做文字流

每个字符仅仅8位用来记录

我们还没有见过的字母

我们现在需要告诉输出流

它需要从文本流读取符号

而不是一个可变长码

要做的这一点 我们引人了一个转义码的概念

转义码是一种特殊的字符

我们能够使用它使得解码器

知道什么时候读取一个文字

从我们的文本流

现在一个转义码并不像

A , B , C 一样是一个字符

但它的的确确存在我们的概率表中

所以它在编码是得到一个可变长码

不是从一颗空白树开始

每个新的文本节点初始化时

都被分配一个转义码并且是100%的概率

我们从字符流中读取 A

我们将它添加到文本中 更新我们的编码

输出转义码到二进制流

然后将A加入文本流

读取B再进行同样的过程

我们之前没有见过

我们输出了装义码的编码和文本值

接下来就是

见证奇迹的时刻了 孩子们

我们读取下一个B 它不是新的

我们之前已经见过了

需要特别注意的是

我们编码一个已经存在的字符时

要在更新统计和编码表

之前输出可变长码

一旦我们根据第二个 B 更新了表中的概率

比重改变 编码分配也改变了

这样编码器就看不到这样的变化

而这就坏事了

解码也是一样的

除非我们遇到一个装义码 它告诉我们

去从文本流中读取一个符号并且输出

首先 我们做的时从二进制流

读取变长码

如果你对这一部分不熟悉 回去看第一篇去

因为我们只有装义码

所以我们仅仅需要从流中读取一位

然后我们是在使用转义码

这就是在告诉我们应该从文本流中读取8位

然后放到输出流

然后更新我们的概率表

我们从二进制流中读取下一个0

也是变长码

我们知道要读取下一个文本

输出 然后更新

这时候 我们有了足够的信息

我们剩下两位从二进制流中读取的就和 B 匹配上了

我们将其输出

我们从输入流读取一个 A

发现它在表中

我们输出我们的编码到输出流

然后更新概率

但是因为我们在维护文本

我们需要在树中创建一个新分支

在这个天真的解决方案中

每阶的符号都有一个指向下一个文本的孩子

但是为了能够正确运作

我们不得不给后续的文本转义码

好消息是最基础的基本就是这样

然而 坏消息是

我们实际还是需要维护一个混合文本链

来得到正确合法的压缩

为了维护那个

我们再来看看编码器 然后

改一些工作方式

我们看见这一阶中

我们没有见过的字符

我们要使我们的链回到0阶

每次我们读取的一个0阶中

已存在的字符

我们都接着读取后续文本的

下一个字符

所以如果开始的字符 A, C

我们将A, C放入

文本以供编码

需要说明的是 我们将任何阶的新字符

都看做是一个全新的字符

如果我们编码是遇到一串A, B, C

而且是第一次遇到 那么我们发现

C是在B之后的

所以我们就把他当做0阶的来处理

输出到文本流

分配转义码

一旦完成了这一整套的编码

我们得到了最终的二进制流和文本流

这样就能传递给网上任何一个需要它的人

不需要去维护一个

单一的概率表

在这个解决方案中

原始串是88字节 而编码后的串是46字节

接近50% 非常的好

很明显 马尔科夫链

进行高效编码你需要去把握一个

独一无二的平衡

压缩需要的链的长度

和你进行压缩的系统

本身可用内存

早早的就耗尽内存

可不是什么好事

一个真正的编码器要解决这个平衡

是通过分开系统分内存的文件

然后把额外的文本写入磁盘

来找到最佳的解决方案

希望你现在在想

我们如何增加了

新的符号是适当调整

转义码时的概率

在我们这个小例子中

我们只是从中简单的减去第一个点

但在现实中并非如此简单

不幸的是这是另一个完全不同的系列

我们不会再这讲解

也就是说 自行Google吧

现在很多人认为马尔科夫链

将来会不可避免的用

用人工智能运行

在所有的数据压缩领域

显而易见

你看 维持一个多阶的马尔科夫链

就像在调试人工智能的

神经网络算法

当然 我们知道那么最成功的

马尔科夫链都是应用在

大数据上面的

现在也有轻量级的马尔科夫链

已经被应用在现代的压缩机

像7-zip LPack ZPack

很容易看出 未来人工智能

和云计算以一些奇怪的方式结合

将会产生一场数据压缩的变革

不过我们在40年内很难见到

而且这又是另外一说了

我是 Colt McAnlis 这里是压缩头

Youtube
Youtube
加入 GDG 字幕组
video_screenshot