惜字如金——通信复杂度问题二则

上学期学信息论这门课的时候,接触到了通信复杂度这个话题。我觉得这是一个非常有意思的领域。70年代时,姚期智老师也在这个领域作出了重要的成果。

借用Matrix67文章里的一段话,介绍一下通信复杂度的定义。

 通信复杂度(communication complexity)主要研究这么一类问题: A 持有数据 $x$ , B 持有数据 $y$ ,他们想要合作计算某个关于 $x$ 和 $y$ 的二元函数值 $f(x, y)$ ,两人至少需要传输多少 bit 的数据才能算出$f(x, y)$的值?

下面举两个有趣的例子。这两个例子,都来自于课堂当中。前一个例子是往年的考试题,后一个例子是老师留下的思考题,不过没有留下解答。

注:下面约定两人中只要有一个人算出$f(x,y)$即算作完成计算。

Problem 1:

A和B分别持有一个不超过n的整数x和y。已知其中一个人手里的数是对方的2倍,现在要计算两人手中的数之和,要传送多少bit数据?

很明显存在$O(\log n)$的方案:A把他手里的数的二进制编码传给B,B就能完成计算了。

很快你会发现,用不着这么麻烦。A和B手里的数在二进制编码上,只有末尾0的个数不一样。实际上A只要把手中的数末尾0的个数告诉B就可以了。

由于末尾0的个数是$O(\log n)$的,编为二进制只要$O(\log \log n)$位即可。

不过,这个做法明显还没有充分利用条件。我们只用到了一个人手中的数是另外一个人的$2^k$倍,也就是说4倍,8倍,不知道是2倍,4倍还是8倍都可以用这个方案。而题目限定了只能是2倍,因此一定还有优化的空间。

还有更好的办法吗?

实际上,只要发2个bit就可以了。注意到二进制编码末尾0的个数相差1,因此A只要发出末尾0的个数除以4的余数,也就是二进制后两位,那么B就能知道他的数是A的一半还是两倍。

举个例子,A发来了11(3),B的末尾0个数除以4的余数是2,那么B就知道他的数一定是A的一半。否则,A应该发来1才对。

到这里,发送1个bit的方案也就一目了然了:两个人末尾0的个数必然是一奇一偶,所以A的末尾0个数是奇数还是偶数,其实不必交流任何信息,B也能知道。

于是,A可以不用发出末尾0个数的二进制最后一位,也就是A只要发出:

x的二进制表示中末尾0的个数的二进制表示的倒数第二位

B就能完成计算。

只看结果,似乎这个方案的设计匪夷所思。然而其中的推理过程,每一步都顺理成章。

Problem 2:

现在考虑三个人的情况。如果现在有ABC三个人,每人有一个$n$位的二进制数,分别叫xyz。

不同的是,他们的数不是拿在手里,而是贴在额头上。

这也就是说,每个人知道另两个人的数是什么,却不知道自己的数是什么。

他们在互通信息的时候,只要一个人发出信息,另外两人都会收到。

对于3个0-1数码来说,可以定义众数。

也就是说,3个数码中出现了2个以上的0,众数就定义为0.否则,其中一定有2个以上的1,众数就定义为1.

更一般地,对于三个n位二进制数,众数定义为每一位分别取众数再连起来。举个例子,三个人手里的数分别是:

0011001

1101100

1001110

那么众数就是:

1001100

回到我们的题目。现在我们想要计算:x,y,z的众数中,1有奇数个还是偶数个?(例子中的答案是奇数个,因为有3个1)

很明显的办法是发$n$位:A把B头上的数发出来,那么B就知道了自己头上的数,从而知道了所有的信息。

能不能更快呢?

由于这个问题没有得到标准答案,我写一下我自己的解法。先说结论,2bit即可。

注意到若三个数码的众数是1,可以分为两种可能:三个数码都是1,或者两个是1,一个是0.

假设在n位中,前一种情况发生了p次,后一种情况发生了q次。题目要求的就是p+q的奇偶性。

我们先看如下方案,发送$2\log n$位:

A先看B和C头上的数,有多少位两人都是1?   将这个数a的二进制表示告诉大家

然后B看A和C头上的数,有多少位两人都是1?将这个数b的二进制表示告诉大家

最后C看A和B头上的数,有多少位两人都是1?将这个数c记在心里。

我们考察a+b+c的值。

如果有一位三个人都是1,那么三个人都会看到:另两个人头上这一位都是1,也就是这一位被算了三次。

如果有一位只有两人是1,那么只有一个人(这一位头上是0的那个)会看到另两个人头上这一位都是1,这一位被算了一次。

所以$a+b+c=3p+q$,它与$p+q$的奇偶性是一样的!于是C就能得到答案。

由于算奇偶性只要二进制的最后一位,所以A和B只要分别把a和b的二进制最后一位告诉大家,C就能知道答案了。我们只用了2bit

Open Question:

有没有1bit的方案?

时间: 2024-10-09 15:15:53

惜字如金——通信复杂度问题二则的相关文章

02.ActiveMQ基本使用

1.面向消息的中间件(MOM) 1.什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,中文简称消息中间件,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成. 一个MOM系统,通常会包括客户端(Clients).消息(Message)和 MOM,客户端是发送或者接受消息的应用程序,消息封装了要传递的内容,MOM可以存储和转发消息.如下图所示,系统A和系统B之间的消息传递,不是直接通信,而是通过中间件来间接的传递

Paxos Made Simple(译)

The Paxos algorithm, when presented in plain English, is very simple. 我叫Leslie Lamport,我最屌. 1. 简介 用于实现高容错性分布式系统的Paxos算法,一直以来总是被认为是难以理解的,或许是因为对很多人来说,初始版本就像是"希腊语"一样(最初的论文是以希腊故事展开的形式)[5].实际上,它也算是最浅显易见的分布式算法之一了.它的核心就是一个一致性算法--论文[5]中的"synod"

dfs 无向图两节点间的所有路径

标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如果能找到一个站点z,使得:当z被破坏后,x和y无法通信,则称z为关于x,y的关键站点. 显然,对于给定的两个站点,关于它们的关键点的个数越多,通信风险越大. 你的任务是:已知网络结构,求两站点之间的通信风险度,即:它们之间的关键点的个数. 输入数据第一行包含2个整数n(2 <= n <= 1000

单进程与 多进程关系及区别(多进程系统linux)

单进程编程:顺序执行 数据同步 复杂度低 用途单一 多进程编程:同时执行 数据异步 复杂度高 用途广泛 1. 多进程的优势在于任务的独立性,比如某个任务单独作为一个进程的话,崩溃只影响自己的服务,其他任务不受影响.如果是多个任务在同一个进程内部利用多个线程进行处理,某个线程发生了未处理的异常的话,会导致整个进程完蛋,所有的任务跟着遭殃 2. 从资源分配上来说,多进程方案比多线程方案更加灵活和自由 3. 不过任务间的通信方面多进程要比多线程复杂些,编一个好的多进程通信方案要比多线程间的通信方案困难

ActiveMQ学习笔记(一)--认识消息JMS

1.面向消息的中间件 1.1 什么是MOM 面向消息的中间件,Message Oriented Middleware,简称MOM,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.一个MOM系统,通常会包括客户端(Client).消息(Message)和MOM,客户端是发送或者接收消息的应用程序,消息封装了要传递的内容,MOM可以存储和转发消息. 1.2 MOM的好处 降低系统间的通信复杂度.有了MOM,系统间通信可以跨编程语言.不用考虑复杂的网络编程,只需

算法笔记_127:蓝桥杯2017模拟赛-本科组习题解答(Java)

 目录 1 算年龄 2 猜算式 3 排列序数 4 字符串比较 5 还款计算 6 滑动解锁 7 风险度量   PS:以下代码部分仅供参考,若有不当之处,还请路过同学指出哦~ 1 算年龄 标题:算年龄 英国数学家德摩根出生于19世纪初叶(即18xx年). 他年少时便很有才华.一次有人问他的年龄,他回答说: "到了x的平方那年,我刚好是x岁". 请你计算一下,德摩根到底出生在哪一年. 题中的年龄指的是周岁. 请填写表示他出生年份的四位数字,不要填写任何多余内容. 1806 public cl

程序员的十层楼

第1层 菜鸟 第1层楼属于地板层,迈进这层楼的门槛是很低的.基本上懂计算机的基本操作,了解计算机专业的一些基础知识,掌握一门基本的编程语言如C/C++,或者Java,或者JavaScript,...,均可入门迈进这层. 在这层上,中国有着绝对的优势,除了从计算机专业毕业的众多人数外,还有大量的通信.自动化.数学等相关专业的人士进入这一行,此外还有众多的其他专业转行的人士,人数绝对比西方多出甚多.并且还有一个优势就是我们这层人员的平均智商比西方肯定高. 没有多少人愿意一辈子做菜鸟,因为做"菜鸟&q

如何利用docker快速构建MySQL主从复制环境

在学习MySQL的过程中,常常会测试各种参数的作用.这时候,就需要快速构建出MySQL实例,甚至主从. 考虑如下场景: 譬如我想测试mysqldump在指定--single-transaction参数的情况下,对于myisam表的影响. 本来想在现成的测试环境中进行,但测试环境中,有大量的数据,执行mysqldump进行全备,产生的SQL文件,很难基于表进行搜索. 这个时候,就特别渴望能有一套干净的实例进行测试. 此刻,快速构建能力就显得尤为必要,很多童鞋可能会问,通过脚本不就能实现么?为什么要

程序员的十个层次,你属于哪一层?

自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外.当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员水平远落后于西方,有些则认为中国的程序员个人能力并不比西方的程序员差,只是整个软件产业落后而已. 那么,到底中国的程序员水平比西方程序员水平差,还是中国有许多优秀的程序员达到或超过了西方程序员同等水平呢?要解决这个问题,必须先知道程序员有多少种技术层级,每个层级需要什么样的技术水平,然后再比较中国和西方在各个技术层级的人数,就可以知道到底有没有差距,差距