您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

神奇的数据恢复算法

时间:2020-01-23 12:29:05  来源:  作者:
神奇的数据恢复算法

 

今天码哥给大家带来一种数据备份与修复的技术——里德所罗门编码。

里德所罗门编码可是应用场景很多,例如我们耳熟能详的RAID(磁盘阵列),又例如在UDP传输中降低丢包导致的数据缺失的情况等等。

什么是里德所罗门编码

这里,先要介绍一种纠错方法——极大距离可分法(MDS)。这是一种很常见的纠错方法,它将原始数据分成等长的N份,并根据这N份数据生成M个冗余的校验数据。此时,M+N块数据中任意M块数据损失,也可以通过剩余N块数据经过计算来恢复原始数据。

里德所罗门纠错算法就是经典的MDS算法。

里德所罗门编码的理论基础

  • 范德蒙矩阵
神奇的数据恢复算法

 

  • 有限域算法
    • 伽罗华域

这里我们那先不过多解释,大家先对矩阵型形式混个脸熟,至于伽罗华域我们后面会说到。

里德所罗门编码的原理

在开始前,我们不得不引入一个数学问题——插值问题

在一些工程实践中,某些变量间是存在函数关系的,但通常不能用公式表示,只能用实验观测得到y=f(x),即一系列xi在函数上的值。有些公式非常复杂,计算其完整公式并不划算,因此我们希望用另一个函数p(x)来尝试逼近f(x)。

此时,假设在二维空间中有n个点,(x1, y1), (x2, y2), …, (xn, yn),希望得到一个多项式的解:

神奇的数据恢复算法

 

这个多项式可以满足我们的当前条件:

神奇的数据恢复算法

 

实际上,可以推演如下:

神奇的数据恢复算法

 

可以看到矩阵A即为范德蒙矩阵,而如果每个点的x值互不相同,那么范德蒙矩阵的行列式值必不为零(略过证明),那么矩阵A就存在逆矩阵。

由此,我们那可以看到,通过对插值问题的讨论,我们发现了一种数据恢复方式,即:

矩阵A * 矩阵B = 矩阵Y

矩阵A的你矩阵 * 矩阵Y = 矩阵B

下面,我们来说一下在里德所罗门编码中如何进行的编解码的。

例如,我有两段数据:

data = [
  [1,2,3,4],
  [5,6,7,8]
]

下面是构建系数矩阵A,A的构建方式是,上方为一单位矩阵,下方是范德蒙矩阵,且:

  1. 单位矩阵的行数与数据矩阵的行数一致,本例中为两行。
  2. 范德蒙矩阵的行数与冗余数据个数保持一致,本例中为一行。并且每行中的ai为前一行的值加1,首行的a1为1。

那么构建出的系数矩阵A为:

A = [
  [1, 0],
  [0, 1],
  [1, 1]
]

编码即为矩阵乘法,得到的结果为:

result = data * A = [
  [1,2,3,4],
  [5,6,7,8],
  [6,8,10,12]
]

可以看到,前两行与原始数据一样,最后一行则是冗余数据。

下面,我们来模拟解码过程,假设我们丢失了第二个数据[5,6,7,8],那么恢复过程如下:

首先,构建系数矩阵A':

A' = [
  [1, 0],
  [1, 1]
]

可以看到,我们跳过了[0, 1],是因为该行对应的数据丢失了,因此构建时也要相应去掉。

然后我们要对A'求逆,得到A'':

A'' = [
  [1, 0],
  [-1, 1]
]

最后,利用矩阵乘法恢复原始数据:

data = A'' * B = [
  [1,2,3,4],
  [5,6,7,8]
]

到此,似乎已经完成了数据丢失后的恢复,但细心的读者可能发现了,在计算逆矩阵的时候可能会存在小数,会造成精度损失,因此,恢复后的数据会和原始数据不一致。

这就是我们接下来要介绍的,数域的作用。

伽罗华域

为了避免矩阵运算中出现小数导致的精度损失,我们要将整个矩阵运算从实数域迁移到伽罗华域中。

伽罗华域是一种有限数域,其值范围为[0, 2^8-1],即0~255。

那么如何进行迁移呢?答案很简单,我们将矩阵中用到的加减乘除四则运算进行一些变换。

在伽罗华域中:

  1. 加法 a + b:被转换为实数域内的异或运算,即 a ^ b。
  2. 减法 a - b:同样是异或运算 a ^ b。
  3. 乘法 a * b:ilog((log(a)+log(b))%255),其中ilog为反对数运算,log为对数运算。伽罗华域上的对数与反对数运算结果在网上是有归纳总结的,可以直接查表获取,因此运算速度会非常快。
  4. 除法 a / b:如果a小于b,则结果为 c = ilog(255 - log(a) - log(b));否则,c = ilog(log(a) - log(b))。

由于本篇为纯理论类文章,涉及较多数学概念,如有纰漏还望告知,感谢您的观看!



Tags:数据恢复算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
今天码哥给大家带来一种数据备份与修复的技术——里德所罗门编码。里德所罗门编码可是应用场景很多,例如我们耳熟能详的RAID(磁盘阵列),又例如在UDP传输中降低丢包导...【详细内容】
2020-01-23  Tags: 数据恢复算法  点击:(137)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(9)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(19)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(13)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(37)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条