神奇的数据恢复算法

在这里插入图片描述
今天码哥给大家带来一种数据备份与修复的技术——里德所罗门编码

里德所罗门编码可是应用场景很多,例如我们耳熟能详的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]
]

神奇的数据恢复算法
2020-01-23 17:01·码哥比特

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

里德所罗门编码可是应用场景很多,例如我们耳熟能详的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))。

将矩阵中的数值运算转换为上面规则中的位运算和模运算,即可避免精度损失问题。

实现

在码哥的开源C语言库Melon中有里德所罗门编码的C代码实现,感兴趣的读者可以参考一下。




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

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

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

相关文章

随时随地刷题题库小程序源码系统+完整代码包+安装部署教程

互联网的普及和在线教育的发展,越来越多的人开始利用碎片时间进行学习。为了满足这一需求,随时随地刷题题库小程序应运而生。该小程序提供了一个便捷的刷题平台,用户可以在任何时间、任何地点进行刷题练习,提高自己的学习效率。 …

C盘满了?这里有释放空间有效方案!

一、需要释放小空间 方法一,下载火绒安全软件,点击垃圾清理 方法二,手动清理: 1.左下角搜索"添加或删除" 2.左下角搜索"存储设置" 3.【我的电脑】-【C盘】-右键【属性】-【磁盘清理】 4.以下位置的不需要…

局域网其他pc如何访问宿主机虚拟机IP?

文章目录 背景贝瑞蒲公英设置虚拟机网络连接测试 背景 使用贝瑞蒲公英异地组网,将家里的pc作为pgsql服务器在公司使用,但是虚拟机的ip和端口访问不了 贝瑞蒲公英 设置虚拟机网络 就是添加端口转发规则 连接测试 公网内其他pc连接测试 可以看到已经连接成…

学习Java第74天,Ajax简介

什么是ajax AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页…

ERP真的“烂”吗?为什么有些公司上了ERP效率反而更低?

ERP是由美国Gartner Group咨询公司首先提出的国际上最先进的企业管理模式之一,也是企业信息化集成的最佳解决方案。 ERP到底是什么? ERP的概念 先打个比方。 把ERP理解成手机。 使用通讯类APP和同事、朋友、亲人交流。 使用购物类APP购买生活工作中需…

一文详细介绍Ehcache

title: Ehcache 快速入门 categories: 编程 Java 中间件 缓存 tags: Java 中间件 缓存 Ehcache abbrlink: 2720adf1 date: 2022-02-17 22:34:30 permalink: /pages/c4647d/ Ehcache 快速入门 EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点&#xff…

中国九大农业区划

数据名称:中国九大农业区划 数据时间:2012年 数据空间位置:全国 数据空间分辨率:1:100万 数据格式:shp 数据坐标系:WGS1984 数据简介:农业区划是管理和指导农业生产的重要手段。我国农业区划种类较多…

如何在公网环境使用固定域名远程访问内网BUG管理系统协同办公

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

评分卡在数字化时代的应用与比较,谁是最强规则引擎?

在数字化时代,规则引擎在各种业务场景中发挥着越来越重要的作用。评分卡作为规则引擎的一个重要应用,被广泛应用于员工KPI考核、业务评估、授信额度计算等等场景。本文引用了奔跑的小武哥的内容,对市面上的几个规则引擎进行对比展示&#xff…

Leetcode的AC指南 —— 链表:142.环形链表II

摘要: Leetcode的AC指南 —— 链表:142.环形链表II。题目介绍:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 文章目录 一、题目二、解析1、快慢指针法2、一个破坏链表的解…

原生html + vue3 获取引用元素refs - elementUI如何在setup中进行表单校验设置

背景: 原生Html 引入elementPlust vue3 ,需要在vue3 setup里做表单校验,通过el-form refform 的refs元素执行校验。 解决方案1: 保存vue挂载之后实例vm为一个常量,由实例来获取:vm.$refs.form.validate(…

GBASE南大通用ADO.NET 结构

GBASE南大通用ADO.NET(全称是 .NET Framework Data Provider For GBase)提 供给.NET 应用程序访问 GBase 数据库、获取数据、管理数据的一套完整的解决 方案。 GBASE南大通用 ADO.NET 的四个核心类及若干功能类具有以下功能:  建立和管…

低代码软件开发的革命

一、前言 如果一个概念能在科技圈火起来,它往往兼具字面简明和内涵丰富的特征,并具有某种重塑产业格局的潜力。低代码(Low Code)就是这样一个典型。顾名思义,低代码是指少用代码,甚至不用代码,仅…

【LeetCode:1901. 寻找峰值 II | 二分】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

中华儿慈会回家的希望宝贝守护计划儿童安全反拐宣传活动

为帮助低龄段儿童树立防拐反拐意识,提高儿童自护自救能力,近日,遂宁艺宁妇女儿童社会工作服务中心在汤普森幼儿园等学校开展了中华儿慈会回家的希望宝贝守护计划活动。 讲师志愿者通过设定动画人物形象讲述防拐故事,教授儿童遇到陌…

EasyExcel导入excel文件解析日期格式数据出现偏差

Excel日期字段值: 7:00:00 解决方案: 增加 DateTimeFormat("HH:mm")

Excel表格中的选项按钮,如何设置?

大家是否会遇到需要勾中选项的情况,我们可以在电子表格中制作出可以勾选、选中的选项按钮,今天我们一起学习一下设置方法。 首先,我们需要先在excel工具栏中添加一个功能模块:开发工具 依次点击excel中的文件 – 选项 – 自定义…

QEMU源码全解析 —— virtio(16)

接前一篇文章: 上一回讲解了virtio_pci_device_plugged函数的第3、4两部分,本回继续讲解virtio_pci_device_plugged函数的其余部分。为了便于理解,再次贴出virtio_pci_device_plugged函数源码,在hw/virtio/virtio-pci.c中&#xf…

Java 泛型 - 从入门到入土

1、概念 泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 Java中引入泛型最…

VR虚拟仿真技术应用到外事警察岗位技能培训的场景及优势

VR治安民警常态化工作实战教学演练是一种利用VR虚拟现实制作和web3d开发技术进行治安民警培训和实战演练的新型教学模式。相较于传统的培训方式,VR治安民警常态化工作实战教学演练具有以下优点: VR实战是一种完全虚拟的实战训练方式,他可以根…