纠错码trick和数据压缩trick

纠错码和压缩算法是同一枚硬币的两面。
两者都来自于对冗余的想法。 纠错码被视为向消息或文件中添加冗余的原则性方法。而压缩算法正好相反,他们会从消息或文件中移除冗余。
压缩和纠错并不是彼此抵消的,相反,好的压缩算法会移除抵消冗余,而纠错编码会增加另一种更高效的冗余。
因此首先压缩一条信息,再往里面添加一些纠错码的做法十分常见。 下面分别介绍两者的具体内容:

纠错码trick

如果使用正确的技巧,即使是极端不可靠的通信频道也可以以极低的错误率传输数据。

1、重复技巧

要确保一些信息被正确传输,你只需要重复几次该信息。

如果你的账户余额是5213.75美元,但不幸的是,网络不稳定,每个数字都有20%的概率变成其他数字

通过运用重复技巧,可以推测真正的余额:假设你请求传输余额5次,并收到如下反馈:

只要我们增加重新传输的次数,直到可靠性高到我们满意为止。

相反,如果一个恶意实体故意干扰传输,并选择制造某些错误,重复技巧将变得不可靠。

并且在下载一个大型软件,显然传输多次以确保正确性是不成熟的。

2、冗余技巧

基本原则:不能只发送原始消息,要发送一些多余的东西以增加可靠性,这里我们讨论的是把原始消息转换成一条更加长的冗余消息,原始消息会被删除。

还是以银行余额为例:

如果你的账户余额是5213.75美元

我们用英语单词简单地拼出余额:

five two one three point seven five

由于信道糟糕,这条消息中约20%的字符会变成随机字符,这条消息可能会变成:

fiqe kwo one thrxp point sivpn fivq

如果我们告诉你对消息中的任何单个变化进行可靠侦测以及纠正变得颗星,我们绝对可以猜出原始消息中的单词。

但是如果我告诉你"367"代表了一个数,但其中一个数字被替换了,你就没办法直道原始数字是多少了,因为这条消息中没有冗余。

冗余和让消息变长有关,消息的每一部分都应该符合某种已知模式。通过这种方法,任何变化都能首先被识别,然后被纠正。

冗余的工作机理:消息由符号组成

要传输一条消息:

1、首先要找出每个符号,并将符号转译成对应的代码字。

2、然后,将转换的消息通过不可靠信道发送。

3、当消息被接收时,查看消息的每个部分,检查其是否为有效的代码字。如果是有效的,只需将其转换为相应的符号,如果不是有效的代码字,你就要找出它和哪个代码字最匹配

在这里插入图片描述

由理查德汉明于贝尔实验室发明的代码和我们相比最明显的区别就是将所有事情都通过0和1完成:

在这里插入图片描述

在编码时,每一组4位数字都加入了冗余,由此产生了一个7位数的代码字。

解码时,首先寻找完全匹配,否则选择最接近匹配。这里我们不深究7位数代码字中的设计。

3、冗余和重复比较

通常用杂项(overhead)衡量纠错系统的成本。杂项就是为确保消息被正确接收而发送的多余信息。

重复技巧的杂项数量巨大,因为你必须发送数份完整消息。

冗余技巧的杂项取决于使用的代码字的具体类型。

4、校验和技巧

上面的两个技巧都属于同时侦测和纠正数据中错误的方法。

还有一种思路:可以先不管纠错,而是将精力集中在侦测错误上。对于许多应用场景,只侦测到一个错误就足够了,然后请求再发送一份数据即可,可以一直请求拷贝,直到得到完全无误的拷贝,我们称之为校验和技巧。

简单校验和:将消息中的所有数字相加,只保留结果的最后一位数作为简单校验和

例:假设消息为 4 6 7 5 6,所有数字之和:4+6+7+5+6=28,保留最后一位数,因此这条消息的简单校验和是8.

在发送原始消息前,将原始消息的校验和附加到消息末尾即可。别人在接收消息后,就能再次计算校验和,并和你发送的校验和比较,看收到的消息是否正确。

缺点:简单校验和最多只能在消息中侦测出一处错误,如果有两个或者更多错误,简单校验和可能就侦测不到了。

在这里插入图片描述

我们定义一种新的校验和,阶梯校验和:每个数都和该数字所在的位阶相乘,每个数都比前一个数大一个位阶,最后只保留最后一位数。

假如消息为4 6 7 5 6,阶梯校验和计算:

(1x4) +(2x6)+(3x7)+(4x5)+(5x6)=87,保留最后一位数,为7,所以阶梯校验和为7;

在这里插入图片描述

只要错误不超过两处,你就能用这两种方法,侦测到错误。

上面描述的校验和技巧只生成了两个校验和数字,但真正的校验和通常会生成很长的数字。

重点是,校验和的长度是固定的。对非常长的消息来说,即使一个较大的校验和,最终和消息本身相比也极小。(校验和长度越长,侦测错误失败概率越小,在现实中几乎不可能失败)

当存在恶意攻击而非糟糕信道时,采用加密哈希函数的特定校验和效果较好。

5、定位技巧

此处介绍一种特殊的冗余技巧,它能让你迅速定位一处错误,我们称之为定位技巧。

假设消息有16个数字(如果有一条长消息,将其打碎成16位数据的“块”,并单独处理每块数据;如果消息比16个数字短,就用0把它补成16位数)

第一步:重新排列消息中的16个数,将其排列成一个从左往右、自上向下读的方框:

4 8 3 7 5 4 3 6 2 2 5 6 3 9 9 7

重新排列为:

在这里插入图片描述

计算每一行的简单校验和,并添加在每行的右侧:

在这里插入图片描述

计算每一列的简单校验和,并添加在每列的底侧:

重新排列所有数,让其能以一次一个数的方式被存储或传输,然后通过从左往右、自上而下的方式读数,最后会得到如下24位数的消息:

4 8 3 7 2 5 4 3 6 8 2 2 5 6 5 3 9 9 7 8 4 3 0 6

把数字放入一个5x5的方框中,最后一行和最后一列都对应随原始消息一起被发送的校验和数字:
在这里插入图片描述

接下来,计算每一行每一列4个数的简单校验和,在接收的校验和值旁边新建一行和一列:
在这里插入图片描述

这里会出现两组校验和:1个是你发送的,1个是你接收的

如果它们都一样,那么可以确定收到的消息很可能是正确的。那么出一个错误呢?

在这里插入图片描述

我们可以很快定位出出错位置,那么我们该如何纠正呢?

我们只要用一个能让两个校验和都正确的数字替代出错的那个数字就可:第二列校验和本应该是3,但结果是8,也就是说校验和要减去5,7-5=2。

在这里插入图片描述

将纠正后的原始16位数消息从5x5的框中取出,忽略最后一行和最后一列,从左往右从上往下取出:

4 8 3 7 5 4 3 6 2 2 5 6 3 9 9 7

这种定位技巧我们称之为二维奇偶校验码,奇偶校验码和简单校验和的意思一样。二维奇偶校验码在一些真正的计算机系统中也有运用,但是并不如其他一些冗余技巧高效。

不过它很容易地具化并展现出不要求复杂数学的情况下,在计算机系统中的流行代码背后发现并纠正错误。

数据压缩trick

数据压缩分为无损压缩和有损压缩

无损压缩

无损压缩需要了解的技巧:

1、行程长度编码:将重复的“行程”和行程的“长度”编码在一起;

例如:AAAAABCBCBCBCAAAADEFDEF可以被编码为:5A、4BC、4A、2DEF

将23个字母压缩为只有11个字母的字符串。

主要问题:数据中心重复的片段必须是相邻的,不能有其他数据。

例如:ABABAB编码很容易(3AB),但是ABXABYAB就行不通了。

2、同前技巧:

基于行程长度编码的改进:

例如下面这个数据:

VJGDNQMYLH-KW-VJGDNQMYLH-ADXSGF-OVJG

DNQMYLH-ADXSGF-VJGDNQMYLH-EW-ADXSGF

忽略连字符,首先识别数据中重复的数据块。

已知最开始12个字母没有重复部分,但是接下来的10个字母VJGDNQMYLH与之前的有部分重合,可以说back12,copy10(数回12个字母,直至抄到第10个字母),接下来7个字母新出现,不能压缩。后面的字母又是大的重复,可以缩写。

我们缩写b代替back,c代替copy,指令可以被总结如下:

VJGDNQMYLH-KW-b12c10-ADXSGF-O-b17c16-b16c10-EW-b18c6

下面一个例子:

使用相同的技巧压缩FG-FG-FG-FG-FG-FG-FG-FG,消息中有8次重复。可以使用FG-FG-FG-FGb8c8,

更简略的写法:FG-b2c14,在口述最开始的两个字母之后,我们有了FG,然后收到b2c14指令,抄完两个之后结果为FG-FG,持续抄写,直到抄写到14个为止。

3、更短符号技巧:

使用频率越高,编码越短。

具体步骤:

1、计算机使用同前技巧传输未经压缩的源文件,让文件中绝大多数重读的数据由短得多的指令取代,这些指令会返回并拷贝其他地方的数据

2、计算机检查传输后的文件,选出经常出现的符号。随后计算机会创建出一张表格,用短数字码代表经常用到的符号,用更长的数字码代表极少用到的符号。

3、计算机会通过直接将文件翻译为2中的数字码再次传输文件。2中计算出的数字码表也会存储到文件中,否则在后面不可能解码。

有损压缩:

有损压缩需要了解的技巧:

1、抛弃技巧:以图像为例,原图像为320 x 240,每两行或每两列像素就抛弃一行或一列,结果得到解析度为160 x 120的新图像。
在这里插入图片描述
可以发现,压缩后的图片重构之后的有较严重的压缩缺陷。

接下来讲解一下jpeg技术的基本原理:

jpeg首先将整张图片划分为8 x 8 的小方块,每个方块都被单独压缩,在没有被压缩的情况下,每个方块代表64个数字(假设为灰度图),如果这个方块符合某些已知模式,如常数色(Constant Color)或渐变色(Smoothly Varying Color)的组合,那么其大部分信息都可以被抛弃,只需要存储每个模式的级别或量即可

参考:【改变未来的九大算法】

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

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

相关文章

常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录1、穷举法2、贪心算法3、递归与分治算法4、回溯算法5、数值概率算法1、穷举法…

工程师英语和计算机证书查询,点击进入国家硬件维修工程师证书查询网站

工程师证书查询网站人力资源社会保障部指定查询国家职业资格证书的唯一官方网站。涵盖全国各省市、各行业、各央企颁发的证书。电脑硬件维修工程师网上能查看国家工信部硬件维修工程师证书查询网址:http://www.ceiaec.org/index.htm工程师证书编号在网上怎么查询如果…

敏捷开发“松结对编程”系列之七:问题集之一

本文是“松结对编程”系列的第七篇。(之一,之二,之三,之四,之五,之六,之七,之八)刚刚参加完MPD 2011深圳站,在演讲中间及后来媒体采访,被问到了一…

C++中的sort函数对二维数组排序是按照什么准则?

遇到的一个疑惑&#xff0c;现记录如下&#xff1a; int main() {vector<vector<int>> envelopes { {5, 8},{6, 7},{6, 4},{2, 3},{8,9} };sort(envelopes.begin(), envelopes.end());for (int i 0;i < envelopes.size();i)cout << envelopes[i][0]<…

数学专业学计算机哪一行,计算数学

计算数学(一个理科专业)语音编辑锁定讨论上传视频计算数学是由数学、物理学、计算机科学、运筹学与控制科学等学科交叉渗透而形成的一个理科专业。中文名计算数学外文名Computational Mathematics所 属数学计算数学专业定义编辑语音计算数学也叫做数值计算方法或数值分析。主…

图片透视变换操作

由于照相机硬件设备本身的误差&#xff0c;可能会导致镜头畸变&#xff0c;从而导致照相机拍摄到的照片产生失真现象&#xff0c;此时可以通过透视变换去适当的校正。 大概的思路&#xff1a;在原图像上确定四个点&#xff0c;然后再新图像上也确定四个点&#xff0c;通过warp…

dp笔记:关于DP算法和滚动数组优化的思考

从网上总结了一些dp的套路以及对滚动数组的一些思考&#xff0c;现记录如下&#xff0c;希望以后回顾此类算法时会有所帮助。 目录1、DP算法经验1、DP算法核心&#xff1a;2、DP算法类别以及例题例1&#xff1a;三步问题例2&#xff1a;最小路径和例3&#xff1a;乘积最大子数组…

【C++ grammar】引用

1、引用就是另一个变量的别名 2、通过引用所做的读写操作实际上是作用与原变量上 引用方式&#xff1a; int x; int & rxx; or int x, &rxx;在C中&是取地址&#xff0c;在C中&放在一个变量的定义前&#xff0c;那就是引用 注意&#xff1a; 这种引用是错误的…

flash安全策略的理解

flash安全策略的理解 2011-06-25 01:48 11人阅读 评论(0) 收藏 举报 一直以来对flash的安全策略是一头雾水&#xff0c;什么安全沙箱&#xff0c;跨域策略文件一堆东西乱七八糟&#xff0c;搞不清楚。不过纠结到现在已经基本上理解了。 flash的安全问题在官方手册上有足够的解…

【C++ grammar】nullptr and Dynamic Memory Allocation (空指针和动态内存分配)

空指针 1.1. 0带来的二义性问题 C03中&#xff0c;空指针使用“0”来表示。0既是一个常量整数&#xff0c;也是一个常量空指针。C语言中&#xff0c;空指针使用(void *)0来表示有时候&#xff0c;用“NULL”来表示空指针(一种可能的实现方式是#define NULL 0) 1.2. C标准化委…

No module named ‘skimage.metrics‘在Anaconda3中的解决方法

1&#xff0c;进入Anaconda Prompt 2&#xff0c;进行安装&#xff1a; pip install scikit-image 3&#xff0c;若还是报错&#xff0c;尝试进行更新一下 pip install scikit-image --upgrade

【C++ grammar】数据类型转换、列表初始化

布尔类型 C语言在其标准化过程中引入了bool、true和false关键字&#xff0c;增加了原生数据类型来支持布尔数据。 布尔类型的大小&#xff08;所占的存储空间&#xff09;依赖于具体的编译器实现。也可以用 sizeof运算符得到其占用的空间 Conversion between bool and int 0…

Python对自定义离散点进行指定多项式函数拟合

自定义离散点进行指定多项式函数拟合 用户自己自己输入坐标点&#xff0c;拟合函数可根据用户输入的多项式的最高次方进行自动拟合函数&#xff0c;拟合方法采用最小二乘法进行函数拟合。 (1,2),(2,5),(3,10),(4,17),(5,26),(6,37)(7,50),(8,65),(9,82) 很显然是函数为二次函…

【C++ grammar】C++简化内存模型

1、stack&#xff08;栈&#xff09; 编译器自动分配内存&#xff08;函数内部定义得局部变量、形参&#xff09; 2、堆&#xff08;Heap&#xff09; 一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;程序结束时可能由OS回收&#xff08;new和delete&#xff09; …

Effect of Diethylene Glycol on the Inkjet Printability of Reactive Dye Solution for Cotton Fabrics.

Effect of Diethylene Glycol on the Inkjet Printability of Reactive Dye Solution for Cotton Fabrics 二乙二醇对棉织物活性染料溶液喷墨印刷性能的影响 Diethylene Glycol 二乙二醇 Inkjet Printability 喷墨印刷性能 Reactive Dye Solution 活性染料溶液 Cotton Fabric…

Silverlight4.0教程之使用CompositeTransform复合变形特效实现倒影

微软于PDC2009上发布Silverlight 4 Beta版&#xff0c;微软在Silverlight 4版本中处理了约8000个的Silverlight终端用户的请求&#xff0c;加入了一系列另开发人员兴奋的新特性&#xff0c;最突出的主要体现在几个方面&#xff1a; 开发工具增强&#xff1a;Visual Studio 2010…

2019年的wps计算机考试题,2019年3月计算机一级WPS模拟题及答案(2.21)

【导语】2019年3月计算机一级考试备考正在进行中&#xff0c;为了方便考生及时有效的备考&#xff0c;那么&#xff0c;无忧考网为您精心整理了2019年3月计算机一级WPS模拟题及答案(2.21)&#xff0c;把握机会抓紧练习吧。如想获取更多计算机一级考试模拟题及备考资料&#xff…

Python求解多项式方程

例如&#xff1a;二次函数&#xff1a;f(x) 10x^2 - 14x 22&#xff0c;依次求解x1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6时函数表达式所对应的函数值。 import numpy as np #f(x) 10*x^2 - 14x 22 p np.array([10,-14,22])#这里存放的是系…

CSS中的border-radius属性

CSS | 边界半径属性 (CSS | border-radius Property) The border-radius property is commonly used to convert box elements into circles. We can convert box elements into the circle element by setting the border-radius to half of the length of a square element. …

【C++ grammar】Enhancement for Type System (C++11 对类型系统的增强)

数据类型 (Data type) int, long int, double, struct, char *, float [], int (*f)()… 计算机程序构造块 计算机程序构造块是不同大小粒度的计算机程序组成部分&#xff0c;它包括变量、表达式、函数或者模块等。 类型系统 (Type System) 类型系统&#xff1a;在编程语言中…