鸽笼原理(抽屉原理)

鸽笼原理(也叫抽屉原理)是一个非常简单但极其有用的组合数学原理。它的核心思想是:

如果把 n+1 个物体放入 n 个盒子中,那么至少有一个盒子里面含有 至少两个 物体。

更一般地,如果把 N 个物体放入 M 个盒子,且 N > M ,那么至少有一个盒子包含 ⌈N/M⌉ 个物体。

直观例子

  • 生日问题:367 个人中,至少有两个人生日相同(因为一年最多 366 天)。

  • 袜子配对:抽屉里有 10 只黑袜子和 10 只白袜子,黑暗中至少要拿出 3 只才能保证有一双同色(3 只袜子放入 2 种颜色的"盒子",必有一个颜色有 2 只)。

  • 握手问题:在任意 6 个人中,要么有 3 个人两两互相认识,要么有 3 个人两两互不认识(这其实是拉姆齐理论的简单特例,也用到鸽笼原理)。

在计算机科学中的应用

  • 哈希冲突:如果哈希表的桶数少于要存储的元素数,必然会发生冲突。

  • 数据压缩:无损压缩算法不可能将所有文件都压缩得更小(因为可能的短文件数目少于长文件数目,根据鸽笼原理,必有不同文件压缩后相同,无法解压)。

  • 算法分析:证明某些算法的最坏情况时间复杂度下界(例如,用比较排序的决策树高度)。

数学形式

  • 若函数 f:A→B且 ∣A∣>∣B∣,则 ff 不是单射(即存在 x1≠x2​ 使得 f(x1)=f(x2)。
相关推荐
武子康2 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
David猪大卫2 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger2 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz5 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化5 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu6 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu7 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖7 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
lisw058 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术8 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer