1

张大胖和张二妮异地恋,见一面很不方面,两人只能通过电脑联系,可是由于计算机之间的通信(无线通信,光纤,双绞线等)存在信道干扰, 他们发送的消息经常出问题。

这一天,张二妮收到了一条张大胖发了的奇怪消息:

J LOWE YOV

这是什么意思?

张大胖看到张二妮迟迟没有回复,又发了两遍,这次张二妮那边收到的消息是:

I HRVE YPU

张二妮把三条消息连起来看, 她发现,第一个位置字符 I 出现的频率最高,第二个字符L出现的频率高,第三个是O,第四个是V ...... 她终于猜出来了张大胖的心思:I LOVE YOU

2

两人周末见了面,聊起上次那让人抓狂的消息, 张二妮不满地说:“你发一堆乱七八糟的数据让我猜,想让人家当数学家啊!”

张大胖不好意地挠挠头:“这网络太差了,几个单词都出错 !不过我也明白了一个道理,通过重复发送能消除不确定性。”

张二妮说:“这怎么行?!你学计算机的,想个办法啊!”

张大胖说:“这样吧,我们搞一个错误检测的办法,以后每次我给你发送一个消息的时候,都附加上一个校验和(checksum),比如我想给你发4个数字 4 5 7 9 。”

张二妮马上打断他:“啊?难道你以后只想给我发数字了吗?”

“不是不是,我就是举个例子而已,其实计算机的所有东西都是二进制数字表示的,这个校验和是这么计算的,我把他们加起来4+5+7+9 = 25,保留个位就是5, 我把它放到消息的最后一并发给你:4 5 7 9 5。”

张二妮说:“奥,我明白了,我收到消息以后,把前面的几个数也累加起来计算校验和,然后和5比较,如果相等,数据就是对的,如果不相等,就是错的,我就不用去搭理它了,对吧?”

张大胖发送的消息:4 5 7 9 5

张二妮收到的消息:4 5 7 8 5

由于数据从9变成了8 ,张二妮再次计算校验和,就是4(只保留个位),和原来的不相等,表示出错。

张大胖说:“真聪明!”

可是张二妮眼珠一转,马上问道:“如果发生了这样的情况呢?”

张大胖发送的消息:4 5 7 9 5

张二妮收到的消息:4 6 7 8 5

两个数据发生了变化,一个减1, 另外一个加1, 校验和还是5!错误检测不出来了!

张大胖叹了口气:“唉,看来这个求和算法太简单了,我得找到一个算法,得产生足够的混乱性和随机性才行。”

3

又是一个周末,两人见了面,互诉相思之苦以后,张大胖说:“我已经找到办法了,用除法。”

“什么除法?”

“就是把要发送的消息转换成一个巨大的二进制数,然后用咱们俩协商好的二进制数字去除,并从中得到余数。把这个余数当成校验和,与消息一并发送。你收到以后也用同样的除法除一下,验证校验和就行了。”

张二妮问道:“我对二进制加法略知一二,这除法怎么弄啊?!”

张大胖说:“很简单,和10进制除法是一样的,只不过出现借位的时候,借1不当作十,当作2就可以了。”

这样,checksum就是那个余数 100 ,发出去的消息就是  1001100 100。

张二妮用同样的除法一计算,核对一下余数是不是相等,就知道数据有没有错误了。

这时候张大胖突然想到了一个问题,用计算机来实现借位除法可不容易啊,必须得简化,反正就是为了得到一个余数吗,搞那么复杂干嘛,使用异或运算

1 xor 0 = 1

1 xor 1 = 0

0 xor 1 = 1

0 xor 0 = 0

简单来说,就是“同性”相斥(结果为0),“异性”相吸(结果为1) 

把这个异或运算用到除法中来,是这个效果:

张二妮都看傻眼了,她说:“刚才的除法我就做不了,你现在又弄什么XOR,太复杂了,我可算不出来。”

张大胖说:“别担心,我写个程序,会自动实现这个算法,到时候你直接用就行了。”

(码农翻身老刘注:这种办法就是大名鼎鼎的CRC的基本原理了,不过CRC做了额外的操作,对被除数的低位补了若干个0(除数长度-1), 然后再做除法,得到的余数作为checksum发送, 而接收方用同样的除数做除法,如果发现余数为0,则数据正确。感兴趣的同学可以自己手工计算一下。CRC背后数学原理就有待大家去进一步研究了。)

4

CRC算法运转得还不错,过了两周,张二妮提出了新的问题:“你这个算法只能发现错误,出了错误还得重传,你能不能想个办法,自动地就纠正错误?”

张大胖:“这个..... 你让我想想吧。”

张大胖怎么才能纠正错误?我们拭目以待。

后记: 

校验和是数据传输中重要的检测错误的手段,是一个非常基础的算法,既有相对简单的累加,如TCP:

也有复杂的CRC,例如以太网的数据帧,校验和有32位。


关于作者:码农翻身公众号作者,畅销书《洞察技术本质,用故事讲解技术是拿手好戏。

往期 精彩回顾

为了爱情,我发明了一个算法相关推荐

  1. noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

    来源 | 异步 | 文末赠书 前段时间大火的国产游戏--<太吾绘卷>,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多 ...

  2. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换...

    package com.Summer_0424.cn;/*** @author Summer* a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换?*/ public cl ...

  3. 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。

    [例5.1] 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点.试编写一个算法,找出A中的所有鞍点. 算法如下: void saddl ...

  4. 从C语言的角度重构数据结构系列(二)-如何衡量一个算法的优劣?

    前言 在学习具体的数据结构和算法之前,每一位初学者都要掌握一个技能,即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率. 在这里给自己打个广告,需要的小伙伴请自行订阅. python快速学习实战 ...

  5. 一个算法对于某个输入的循环次数是可以事先估计出来的_数据结构与算法:算法...

    算法(algorithm )是指令的集合,是为解决特定问题而规定的一系列操作.它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据集合作为输出.一个算法通常来说具有以下五个特性: 输入:一 ...

  6. 【小米笔试题】实现一个算法,确定一个字符串的所有字符是否全部不同

    实现一个算法,确定一个字符串的所有字符是否全部不同. 下面给出3种可行方法,都经过测试.(其中方法一,刚开始理解有些困难,需要多思考一下) package XiaoMi;import java.uti ...

  7. 数组分成两组差值最小 python_数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0x100,元素个数也是大于0, 小于100 。...

    比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0: 比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1 ...

  8. 大剑无锋之如何评判一个算法的优劣【面试推荐】

    ①时间复杂度:同样的输入规模(问题规模)花费多少时间 ②空间复杂度:同样的输入规模花费多少空间(主要是内存) 以上两点越小越好 ③稳定性(健壮性):不会因为输入的不同而导致不稳定的情况发生 ④算法思路 ...

  9. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来

    题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...

最新文章

  1. php7.2 的好处,PHP 7.2 中弃用的功能
  2. 安装程序无法继续 因为你的计算机安装了更新的,xp安装不了ie提示“安装了更新的Internet Explorer版本”怎么办...
  3. 怎么判断适合学java_如何知道自己是否适合学习java开发
  4. 考试 彩色 离散化+类暴力
  5. OneNand、Nand和Nor三种Flash的区别
  6. 苹果的Swift 2.0,Raspberry Pi Zero vs CHIP以及更多新闻
  7. linux分割内容单引号,linux变量、cut_sort_wc_uniq_tee_tr_split 命令使用方法
  8. c语言程序设计第二版课后答案 机械工业出版社,C语言程序设计 第2版
  9. python if elif else用法_python----if -- elif -- else 用法
  10. 零基础学python知乎-35岁了零基础自学Python可行吗?
  11. c语言学习建议,学习c语言的建议
  12. 【THUSC 2018】菜鸡互啄记
  13. 单例模式、Single
  14. C++连接Wlan/Wifi网络设备
  15. 【++运算符重载】c++实现递增运算符重载
  16. 有一种选择叫女程(2)
  17. html win10虚拟键盘,五种打开win10虚拟键盘的方法 win10虚拟键盘快捷键
  18. 视频如何加水印文字?一分钟学会
  19. Linux-QT5.9学习笔记——事件
  20. 【MTU】Windows/Linux下修改MTU

热门文章

  1. javascript 随机取任意四个字母和随机生成一个名字
  2. 数据仓库和传统数据库的关系
  3. 同一进程内 Bind方式的意义
  4. HTML5期末大作业:旅游住宿酒店网站设计——旅游住宿酒店(12页)
  5. 站长常用Shell脚本整理分享51-59
  6. 【转载】我的算法图书
  7. 基于HTML+CSS+JavaScript “小味鲜“餐厅网页设计
  8. Dev-C++的几款游戏
  9. 隐藏SSID和STA搜索隐藏SSID原理
  10. Python 3sigma检测异常数据