java 数据纠错,纠错码简介

纠错码是个什么东西

引出

网络中的通信基于TCP和UDP两个通信协议, 这大家都知道的, 什么TCP的三次握手等等, 面试经常被问到. 三次握手是为了保证连接的正确建立. 但是, 在通信的时候, 你如何保证你的消息正确送达了呢? 有人说了, 有收到请求的响应包. 但我说的不是这个,

比如说, 你发送了一个数字1, 你如何保证接受方收到的数字也是1呢? 毕竟, 在网络中环境如此复杂, 就算是物理上也不能保证数据一定是不变的啊. 比如有一个机房在上海, 你在北京访问, 那数据是要途径一千多公里的, 在这个传输的过程中会受到各种干扰, 很难保证数据不会失真.

这个时候, 纠错码出现了. 简单介绍一下, 其中所有有关数学的内容的去掉了, 毕竟太高深, 咱也不懂.

思考

因为计算机传输中只存在0和1, 所以可以简单将其类比为数字.

想象一个场景, 你需要将一组数字发送给B, 在发送的过程中, 每个数字都有20%的概率变成其他数字(途中收到干扰导致失真). 你们应该如何保证接收到的数字与发送的数字一致呢?

假定这组数字是: 123456789

方案一

根据概率论, 每个数字20%的概率会错乱, 也就是有80%是正确的. 那只要样本足够多, 那出现次数最多的就是正确的.

比如, 发送了5次, 收到的内容是:

123456781

127456789

623456789

123456789

123459789

将每一位单独拿出来, 找到出现次数最多的数字就是正确的数字.

但是, 这样不能保证完全正确, 毕竟是概率事件, 需要通过增大样本数量来增加准确率. 只要传输的次数足够多, 就能够将错误的概率降低到足够小.

很好, 这样确实能解决问题. 但是, 如果只是通信间传输几k的数据还好, 如果下载一个1G的电影, 为了纠错, 需要你耗费10G的流量下载10遍, 你能接受么?

方案二

方案一被pass了. 既然多次传输不行, 又该如何是好呢? 单次传输的话, 仅仅依靠消息本身是肯定无法保证可靠的.

换个角度想一下, 既然每个数字的出错概率是20%, 那么如果将1个数字映射到4个数字上面, 整体出错的概率就下降了. 为了方便理解, 使用英文来表示映射关系, 即1(one), 2(two)...

如果你收到了一个数字345, 告诉你其中可能存在错误, 你是无法知道它原本的数字是什么的. 但如果你收到的是 ofe, 你应该能够很快想到它是 one, 并将其还原.

这个时候, 假设你收到的数据是这样的: one tno shree four fiae . 你应该能够很快将其还原为: 12345 . 只需要检查每个单词, 若是有效的直接转换, 若是无效的则转换为最接近的单词.

当然, 计算机在传输过程中是无法传输英文的, 所以将数字映射到另一个较长的数字(编码)上去. 这个编码就是 汉明代码. 如下:

0000 -> 0000000

0001 -> 0001011

0010 -> 0010111

...

将每一个4位都转换为7位. 这种方案存在匹配后的值是一个较接近的错误的值么? 据说不会, 涉及到数学领域, 没太懂.

至此, 其实纠错的任务已经接近完成了. 通过数据的冗余, 已经可以将出错的概率降低到很小了.

方案三

能否使用更少的数据来进行纠错呢? 下面介绍的就是了, 一种称为校验和的手段. 这种方法仅仅用来校验数据是否出错, 但不会对数据进行修复.

比如你需要传输的数字是: 4567.

在后边添加一位数字作为校验数字, 校验数字的生成规则是四个数字的和取个位数. 即: 4+5+6+7=22, 校验数字为 2.

当接到45672 这个数字时, 只需要进行简单的计算, 就可以知道数据是否正确. 其中任何一个数字出错, 结果都不会是2. 但是, 如果有两个数字出错呢? 你收到的数字是: 44772. 你通过计算发现校验数字是2. 嘿嘿.

也就是说, 一个校验数字只能保证一位出错的情况, 这时通过添加校验数字, 通过另外一个生成规则再生成一个校验数字添加到后边(这里不能使用同一个生成规则), 就可以处理两位出错的情况了. 但是三位出错呢? 为了保证完全校验, 就需要添加更多位数的校验数字.

但是如果是一个100mb的文件, 总不能用于校验的大小也是100mb吧. 勿慌, 只需要一个100位的数字进行校验. 这里又涉及数学领域了, 其出错的概率微乎其微, 几乎可以忽略.

还记得在各个官网下载文件的时候附送的MD5校验码吗? 没错, 就是它了. 可以校验文件在传输过程中是否被损坏或是否被篡改.

方案四

上面是添加校验数字的方案只能够检测数据是否出错, 而不能够对出错的数据进行修复. 现在将校验数字的思想改进一下, 使其可以对错误数据进行修复.

假设我们发送的数字是: 12341234123412134

将其每4位分开, 并分别计算其行和列的校验和. 如下图:

7Myt3ld9670se0pAN8ytSXmfIxINPF3n+WeIVt89n5Q8MjXCS9xgAAAAAAAAAAAAAAAAAAAAAgNE3r+qNAWIsUHcAAAAASUVORK5CYII=

然后, 将其铺开进行传输: 123401234012340123404826

假如, 接收到的数据中有一位出错了, 数据变成了下面这种:

g4l5TEARBEARBEARB8NceHAgAAAAACPK3HuQKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICFAINXi21VwBPiAAAAAElFTkSuQmCC

你通过计算, 发现第二行和第三列出现问题, 很快就可以定位到数字5. 计算第三列校验和: 3+5+3+3=14, 个位为4. 将5-2, 得到预测的原始数字3. 然后在计算第二行的校验和是否为0. 完成纠错. 最后将纠正后的正确的数字从中取出来. 得到原始的数据: 1234123412341234.

这种纠错方式被称为: 二维奇偶校验码.

计算机硬盘, 网络通信等都有着纠错码的身影, 它保证了数据的传输可靠. 在TCP的每个包中都存在校验和内容, 若校验出错, 则包会被直接丢弃.

简单说一下...

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[纠错码简介]http://www.zyiz.net/tech/detail-134151.html

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

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

相关文章

dataframe修改数据_数据处理进阶pandas入门(一)

前言NumPy作为数据处理的利器,在对数据进行科学计算、存储处理大型矩阵等方面为我们带来了极大的方便,但对于更进一步的数据分析任务,文件操作等方面显得有些吃力。于是,作为NumPy的进阶库pandas应运而生,在实际应用中…

java6个人抽奖抽三个人,基于Java的抽奖逻辑

小组在做一个抽奖系统,现在给我分配到了抽奖逻辑这方面的实现。EMMM,拿到分配的时候是懵B的。老大给的需求图给的关键表结构DROP TABLE IF EXISTS dd_annual_meeting_check;CREATE TABLE dd_annual_meeting_check (check_id int(255) NOT NULL AUTO_INCR…

python自动化教程_Python 任务自动化工具 tox 教程

1、tox 能做什么? 细分的用途包括: 创建开发环境 运行静态代码分析与测试工具 自动化构建包 针对 tox 构建的软件包运行测试 检查软件包是否能在不同的 Python 版本/解释器中顺利安装 统一持续集成(CI)和基于命令行的测试 创建和部…

php 添加inotify扩展,php inotify 扩展的安装

一、安装1) 从内核和目录里面查看是否支持inotify[rootnfs01 ~]# uname -r2.6.32-573.el6.x86_64[rootnfs01 ~]#** ls -l /proc/sys/fs/inotify/** -→主要查看下面有没有三个目录总用量 0-rw-r--r-- 1 root root 0 1月 21 13:03 max_queued_events-rw-r--r-- 1 root root…

简述python执行原理_Python程序的执行原理(1)(2)

Python程序的执行原理(1)(2) 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。 2. 字节码 字节码在Python虚拟机程序…

python文本特征选择,机器学习--特征选择(Python实现)

特征选择就是从原始特征中选取一些最有效的特征来降低维度,,提高模型泛化能力减低过拟合的过程,主要目的是剔除掉无关特征和冗余特征,选出最优特征子集;常见的特征选择方法可以分为3类:过滤式(filter)、包裹式(wrapper…

用python画风车_python接口自动化()一)(实现一款简单的接口自动化框架)

python接口自动化一(设计一款自己的接口自动化框架) 一、起因: 前面学习过了python接口requests来进行接口测试,但是在框架选择上还是选择的unittest。当接口数量不怎么多时还好,但是当接口的量上去了,一切…

系统新模块增加需要哪些步骤_防锈高效型干式地暖模块解决了装修施工配合的哪些难点?...

通过前面的讲解,我们知道铝板干式地暖末端应用于地暖、辐射冷暖等系统的技术优势非常明显,即省层高、省费用、效果好、空调舒适、业主使用满意度高等,随着水泥黄沙的大幅涨价,其成本优势也突显出来,越来越多的暖通公司…

python爬取网站数据步骤_python怎么爬取数据

在学习python的过程中,学会获取网站的内容是我们必须要掌握的知识和技能,今天就分享一下爬虫的基本流程,只有了解了过程,我们再慢慢一步步的去掌握它所包含的知识Python网络爬虫大概需要以下几个步骤: 一、获取网站的地…

matlab chan算法定位,MATLAB实现基于Chan氏算法的三维TDOA定位

% 功能:基于chan算法的TDOA三维定位function [zp] Chan_3(Noise,MS)%基站数目BSN 7;%基站位置,每一列为一个基站位置BS [0, 2*sqrt(3), -2*sqrt(3), sqrt(3), -sqrt(3), -sqrt(3), sqrt(3);0, 0, 0, 3, 3, -3, -3;0, 0, 0, 0, 2, 2, 0];%无噪声情况下BS到MS的距离…

Redis源码精读:字符串

文章目录 前言代码位置核心类型SDS结构获取sds字符串的元数据的宏获取字符串长度重新设置sds长度创建字符串感悟最后 前言 Redis中实现了sds(simple dynamic string)这种字符串,它比c语言标准库的char*字符串更加实用 代码位置 src/sdc.h …

python自动化测试脚本可以测php吗_python unittest实现api自动化测试_python

这篇文章主要为大家详细介绍了python unittest实现api自动化测试的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目测试对于一个项目的重要性,大家应该都知道吧,写python的朋友,应该都写过自动化测试脚本。…

Linux服务器版本鼠标,安装GPM给Linux虚拟控制台提供配置鼠标支持

给你的 Linux 系统安装 GPM,这样我们就可以在虚拟控制台中配置鼠标,比如进行复制与粘贴操作。GPM 是一个守护程序,是通用鼠标的首字母的缩写,它可以帮助你配置 Linux 虚拟控制台的鼠标支持。GPM 在以下场景中特别有用:…

valgrind 内存泄漏_应用 AddressSanitizer 发现程序内存错误

应用 AddressSanitizer 发现程序内存错误作为 C/ C 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏。过去常用的工具是 Valgrind,但使用 Valgrind 最大问题是它会极大地降低程序…

配置文件存int类型_Redis详解(五)------ redis的五大数据类型实现原理

> 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读。回复《电子书》有我为大家特别筛选的书籍资料前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构。在Redis中,并没有直接使用…

java list 占用内存不释放_性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise...

对于动辄上百 M 大小的神经网络来说,模型压缩能够减少它们的内存占用、通信带宽和计算复杂度等,以便更好地进行应用部署。最近,来自 Facebook AI 的研究者提出了一种新的模型量化压缩技术 Quant-Noise,让神经网络在不降低性能的前…

苹果系统安装python环境_如何在mac下配置python虚拟环境

安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip install virtualenv # 安装虚拟环境 2. sudo pip install virtualenvwrapper # 安装虚拟环境扩展包 3. vim .bash_profile …

linux程序无法获取cpu资源,Linux系统编程获取系统的CPU资源

还是纯干货&#xff0c;代码拿来&#xff1a;#include #include #include #include #include #include #include void work(){FILE *f;int i;double x 4.5;f tmpfile();for(i 0; i < 10000;i){fprintf(f,"Do some output\n");if (ferror(f)){fprintf(stderr,&q…

dbnetlib sqlserver不存在或拒绝访问_404:对不起,您访问的网页不存在

404&#xff1a;对不起您访问的网页不存在https://www.zhihu.com/video/1101123296195723264你可能在上网时也好奇过&#xff0c;为什么点开一个无法显示信息的页面&#xff0c;上面会出现数字404&#xff1f;要解释这个问题&#xff0c;我们需要从互联网诞生之初说起。20世纪8…

linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...

很多人都喜欢车辆上有一个大屏的中控。那种大屏的中控不仅功能很多&#xff0c;而且还很实用。但是有很多车需要高配才能有中控。而且还需要加钱。很多人在买车的时候都会选择一些低配的车&#xff0c;然后自己去安装中控。有些人认为原厂的中控不仅价格贵&#xff0c;而且还有…