鸽巢原理

鸽巢原理是一种非常有意思的思想:可以让看似复杂的问题变的简单。

其中一种简单的表述法为:

  • 若有n个笼子和kn+1只鸽子,所有的鸽子都被关在鸽笼里,那么至少有一个笼子有至少k+1只鸽子。(n,k>=0)

虽然鸽巢原理看起来很容易理解,但有时使用鸽巢原理会得到一些有趣的结论:

鸽巢原理经常在计算机领域得到真正的应用。

比如:哈希表的重复问题(冲突)是不可避免的,因为Keys的数目总是比哈希函数构造的索引的数目多,不管是多么高明的算法都不可能解决这个问题。

所以会出现很多处理冲突的算法:

(1).开放地址法(线性探测再散列,二次探测再散列,伪随机数序列)

(2).再哈希法

(3).链地址法;

(4).建立一个公共溢出区;将产生冲突的key都存放在该溢出区;

这个原理,还证明任何无损压缩算法,在把一个文件变小的同时,一定有其他文件增大来辅助,否则某些信息必然会丢失。

趣味证明一:北京至少有两个人头发数一样多。
证明:常人的头发数在15万左右,可以假定没有人有超过100万根头发,但北京人口大于100万。如果我们让每一个鸽巢对应一个头发数字,鸽子对应于人,那就变成了有大于100万只鸽子要进到至多100万个巢中。所以,可以得到“北京至少有两个人头发数一样多”的结论。
另一个例子:

趣味证明二:盒子里有10只黑袜子、12只蓝袜子,你需要拿一对同色的出来。假设你总共只能拿一次,只要3只就可以拿到相同颜色的袜子。

因为颜色只有两种(鸽巢只有两个),而三只袜子(三只鸽子),从而得到“拿3只袜子出来,就能保证有一双同色”的结论。
更不直观一点的例子:

趣味证明三:有n个人(至少2人)互相握手(随意找人握),必有两人握手次数相同。
这里,鸽巢对应于握手次数,鸽子对应于人,每个人都可以握[0,n-1]次(但0和n-1不能同时存在,因为如果一个人不和任何人握手,那就不会存在一个和所有其他人都握过手的人),所以鸽巢是n-1个。但有n个人(n只鸽子),因此证明了命题正确。

其他:

366个人中必然有两个人的生日相同;

给定5个正整数,其中至少有3个数的和被3除尽。
想想还是挺有意思的!!!

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值