阅读更多

0顶
3踩

数据库

转载新闻 超酷算法:喷泉码

2014-10-29 09:54 by 副主编 mengyidan1988 评论(2) 有7863人浏览
今天的主题是喷泉码,或者称为“无率码”。喷泉码是将一些数据,例如文件,转化为一个有效的任意数量的编码包的方法,这样只要你接收到稍大于信源数据包数量的编码包的子集,就可以恢复信源数据。换句话说,你创建了一个编码数据的“喷泉”,只要接收端接收到足够的“水滴”,就可以恢复文件,而不管它们接到哪一个遗漏了哪一个。

让喷泉码如此知名的原因是,它允许你在有损连接(比如说因特网)的情况下传输文件,而且传输过程不依赖于你是否知道丢包率,也不需要接收端反馈哪些数据包丢失了。可以看到在很多场景,从通过广播媒介传送一个静态文件,比如点播电视,到在多源并行下载中传播文件包,像BitTorrent那样,喷泉码都得到了很好的应用。

虽然从根本上喷泉码惊人地简单。它有许多种类,但是在本文中我们只介绍最简单的——LT码,或者Luby变换码。LT码生成编码包的步骤如下:

在 l 和 k 的之间随机选取一个数字 d,d 代表文件中块的数量。我们将会在后面的内容中讨论如何选取最佳的d。
从文件中随机选取 d 块,并把它们组合起来。这里我们可以用异或运算来组合这些块。
传送合并的块,同时发送它由哪些块构成的信息。
这些非常简单是不是?主要依赖于我们怎么选取块的数量并组合起来(叫做度分布),在接下来我们会简短的介绍一下。你可以从上面的描述中看到有些编码块最后只由单一源码块组成,而大部分将由多个源码块组成。

另外一个可能不是立刻显现的事情是,虽然我们确实不得不让接收端知道输出码块由哪些码块合并产生的,我们不需要详细地发送那个列表。如果发送端和接收端使用相同的伪随机数生成器(pseudo-random number generator,PRNG),我们可以用一个随机选择的种子来生成PRNG,并且用这个来选择度和该组源码块。然后我们只需要在发送编码块的同时发送种子,我们的接收端可以用相同的过程来重建我们使用过的源码块列表。

解码的过程有一点复杂,但是没有很复杂:
  • 重建用于生成编码块的源码块列表。
  • 对于列表中的每一个源码块,如果已经解码了,将它和编码块做异或运算,并且把它从源码块列表中移除。
  • 如果在列表剩下至少两个源码块,将编码块加入到一个等候区。
  • 如果在列表中只剩下一个源码块,我们已经成功的把另一个源码块解码了,那么把它加入到已解码文件中,迭代等候列表,重复以上过程直到有编码块包含它。

让我们通过一个译码实例来更清晰说明这个过程。假设我们收到5个编码块,每个长度是一个字节,并且我们知道每个源码块由哪些构成。我们可以用图来表示数据,如下所示:



左边的结点代表我们收到的编码块,右边的节点代表源码块。我们收到的第一结点0×48只由一个源码块(第一个源码块)构成,所以已经知道是哪个块。沿着指向第一个源码块箭头的反向,可以看到第二个和第三个编码块都只依赖于第一个源码块和另外一个源码块,由于我们知道第一个源码块,我们可以对它们做异或运算,如下图所示:



重复以上过程,我们可以看到我们现在有了足够的信息来解码第四个编码块,它依赖于第二个和第三个源码块,而这两个我们现在都知道了。对它们做异或运算,可以得到第五个也是最后一个源码块,如下所示:



最后,我们可以解码最后剩下的源码块,得到剩余的信息:



应该承认的是这是一个非常特殊的例子,这个例子刚好接收到我们在译码这个信息时需要的块,没有剩余的,并且是一个非常简单的顺序,但是这个例子很好的演示算法的原理。我确定你可以看到这个算法应用到大规模码块和大规模文件中会相当简单。

在前面我提到选择每个编码块都需要的源码块的数量,即度分布,是很重要的,它确实重要。理想情况下,我们需要生成一些只包含一个源码块的编码块,然后可以开始译码了,大多数编码块依赖很少的其他编码块。这种理想的分布是存在的,叫做理想孤波分布

不幸的是,理想孤波分布在实际情况中并没有这么理想,正如随机变量使得有些源码块不被任何编码块包含,或者当所有知道的块用完之后译码停止了。理想孤波分布的一个变形,叫做稳健孤波分布,在这方面进行了改进,用非常少的源码块生成更多的码块,也通过合并所有的或几乎所有的源码块生成一些码块,来帮助破译最后一些源码块。

简而言之,这就是喷泉码的,更确切的说是LT码的,工作原理。LT码是已知的喷泉码中效率最低的,但是最易解释的。如果你想进一步学习,我强烈推荐读这篇关于喷泉码的技术论文,也可以读Raptor码,Raptor码只比LT码增加了一点复杂度,但是在传输开销和计算上都显著的提高了它们的效率。

在我们总结之前有一个进一步的思考问题。对于系统来说喷泉码可能看起来很理想,比如说比特流,它允许种子生成和散布几乎无限制数量的码块,或多或少的消除了稀疏种子流“最后一块”的问题,而且确保两个随机选择的并行端几乎总有有用信息相互交换。但是它面临一个重大的问题:验证从并行端接收到的数据将会很难。

像比特流这样的协议使用安全散列函数,比如说SHA1,和一个可信任中心(最初的上传者),向所有的并行端发送一个权威散列表。每个并行然后可以验证他们下载的散列块的文件包,并且和权威散列进行对比。但是对于喷泉码,这个是很难的。根本没有方法在编码块上计算SHA1散列,更不要说单独块上的散列。我们不能相信我们的并行端计算的结果,因为它们可以对我们撒谎。我们可以等到我们得到全部文件,然后从无效码块列表出发,尝试推断什么样的编码块是无效的,但这是困难的也是不可靠的,而且信息来的时候可能已经为时已晚。一个可供选择的方法是让最初发布者公布一个公共密钥,并且标注所有的生成块。然后我们就可以验证编码块了,但代价是:现在只有最初发布者可以生成有效的编码块了,并且我们失去了最初使用喷泉码的很多好处。似乎我们被困住了。

还有另一种选择,而且已经证明是一个非常聪明的方案,叫做同态哈希,尽管它有自己的注意事项和缺点。我们将会在下一版的超酷算法中讨论。
  • 大小: 26.7 KB
  • 大小: 27.9 KB
  • 大小: 28.8 KB
  • 大小: 29.4 KB
来自: 伯乐在线
0
3
评论 共 2 条 请登录后发表评论
2 楼 battlefly 2014-10-29 22:40
嗯,看完第一行直接点wiki链接开始学比较快
1 楼 ray_linn 2014-10-29 14:49
金山词霸翻译的吧

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 手把手教你做超酷的条形码效果第1/3页

    手把手教你做超酷的条形码效果

  • 超酷算法:同型哈希

    从上一篇超酷算法文章中,我们学到看一个绝妙的概率算法 – 喷泉码。使用这个算法可以把大文件分解成几乎无穷的小块。这样,可以收集任意其中的小块,只要收集到的块的大小稍微比原始文件稍微大一点,我们就可以...

  • 超酷算法:日志结构化存储

    我这样称赞它,你可能会想知道什么系统已经用了这个算法。令人惊讶的是我知道的很少有用的,但是这里有一些著名的例子: 尽管原始的 Berkeley数据库 使用了相当标准的体系结构,Java端口, BDB-JE 使用了我们...

  • 超酷算法:Levenshtein自动机

    本文由 伯乐在线 - Justin Wu 翻译,黄利民 校稿...在上一期的超酷算法中,我们聊到了BK树,这是一种非常聪明的索引结构,能够在搜索过程中进行模糊匹配,它基于编辑距离(Levenshtein distance),或者任何其它

  • 超酷算法:用四叉树和希尔伯特曲线做空间索引

    随着越来越多的数据和应用和地理空间相关,空间索引变得愈加重要。然而,有效地查询地理空间数据是相当大的挑战,因为数据是二维的(有时候更高),不能用标准的索引技术来查询位置。空间索引通过各种各样...

  • fountainCode 喷泉码简介

    喷泉码可以理解为通过构造数据冗余来避免数据丢失,也就是说将数据分成很多段,部分片段 里面的信息量就能对原始数据的信息量进行很好的表达,接收方接收到部门数据片段后就能还原出完整的数据。 这种编码的发送端...

  • 排序算法详细讲解(超酷)

    排序算法作为数据结构中重要的部分,是必须要掌握的知识之一。 目录 前言 一、插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序 二、交换类排序 1.冒泡排序(相邻比序法) 2.快速排序 三、选择类...

  • CSS实例:超酷的网站导航按钮

    网页制作Webjx文章简介:本文一步一步手把手教你打造一个极酷的三层分离的标准滑动门导航菜单. 导言:本文一步一步手把手教你打造一个极酷的三层分离的标准滑动门导航菜单,从思路、原理、步骤,手段可谓“无所不用...

  • 6 个超酷的网站,专门用于学习算法

    点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达来自:程序员书库(ID:CodingBook)书单来自:https://levelup.gitconnected.com...

  • PONG:老派超酷游戏庞东鼎

    乒乓球 老派超酷游戏庞东鼎。

  • solo-project:阿奇的超酷个展

    个人项目 阿奇的超酷个展

  • 超酷表格支持库

    超酷表格

  • my-playground:我定制的超酷脚本

    我定制的超酷脚本 @todofy中列出的所有待办事项: 感兴趣的领域: JS动画 HTML5画布 网络摄像头,音频API 3D,仿真和建模

  • SpotifyCaster:适用于Spotify的超酷chromecast客户端

    SpotifyCaster 这是一个有趣的周末项目,用于播放和播放Spotify中的歌曲。 它是由于Spotify缺乏Chromecast支持和不稳定的替代方案而感到沮丧的。 这并不是为了超级干净和专业而设计的,但是效果很好。...

  • CSS黑色超酷多级菜单特效代码

  • hip-chatbot:超酷的臀部聊天机器人

    聊天机器人该程序为 hipchat 聊天室用户提供了少量的交互性。 例子: 对用户或对象的分数进行加减运算:'john++' --> woot! 约翰的分数现在是 1。 随时查询分数:'@scoreridley'-->ridley的分数是42。...

  • 1900-2100 两百年超酷百年日历特效代码

    介绍: 两百年国历与农历程式 (IE版),包括日历、世界时间、农历、阳历、阴历、节日、时区、节气、干支、生肖等,功能非常全,推荐!

  • react-cookienotice:您网站的超酷Cookie横幅

    您网站的超酷Cookie横幅 安装 纱 yarn add react-cookienotice npm npm i --save react-cookienotice 用法 import * as React from 'react' import CookieNotice from 'react-cookienotice' class Example ...

Global site tag (gtag.js) - Google Analytics