计数必须符合结果的区别
十条记录选三条用于评估,若结果是无序子集,有 120 种;若三条分别担任第一、第二、第三审核人等不同角色,有 720 种。输入看似相同,结果区别不同。计数公式只对明确模型正确。
先问结果包含什么、顺序是否重要、同一对象能否重复、不同构造是否代表同一结果,再用加法、乘法、双射与补集证明公式。概率还需要抽样规则,有限集合不自动均匀。
回忆检查:构造小笛卡尔积、列幂集、解释双射与分类证明。按需复习集合和证明。计数是非负整数,本模块只讨论有限结果;后续概率更详细区分概率与频率。
加法、乘法与决策树
加法规则计数不交选项:A、B 不交时 。竖线这里是有限基数,不是绝对值。重叠成员会被加两次,必须分成真正不交情况或在第 5 节修正。
乘法规则用于每个第一选择都有相同数量后续选择的阶段。第一阶段 a 种,各有 b 个允许延续,路径数 ab;独立选项集是笛卡尔积基数。计数阶段并不自行断言概率独立,它描述允许构造树;概率独立是抽样模型额外性质。
分支数量不同应相加,不能假定共同因子。两个任务各允许三位工人,一个只允许一位,共七种任务—工人配对,不是九。若每任务都允许三人,乘法才是另一个正确模型。
结果是四个有序位置,每位允许零或一,允许值不受其他位置限制,树叶数 。允许重复,0011 与 1100 不同。要求恰好两个一则限制为较小结果集,不再计全部十六。
三位二进制选择树有八叶。每条根到叶路径代表完整有序串,共用前缀是中间选择,不是额外结果。
双射把难计集合一一对应到易计集合。须验证每个允许结果恰好一个表示,每个允许表示都产生结果。遗漏或重复使对应不能证明计数相等。第 4 节隔板法是例子。
构造计数也需范围明确。叶应是完整结果,不是部分选择。若丢弃顺序后不同路径变同一结果,叶计数会过计无序模型。因此有序选择树不能未经调整就计子集。
不选择任何位置有一个空序列,不是零个。零阶段的空乘积为一;实际某阶段没有可选项则所有构造失败,含零因子的积为零。这两种“空”不同。
CS 决策路径描述配置、串、分配与搜索空间。空间大小不等于每个算法耗时,算法可利用结构或只检查部分。AI 数据划分取决于记录是否不同、组是否具名、是否要求同主体记录同组。任意记录子集公式不会自动尊重主体约束。
两种不交任务类型分别三与五个任务,每任务允许两位工人,共多少配对?一任务只允许一人时如何?
查看答案
原来 ;减少一个分支选择后十五。原共同因子不再适用于每任务。
排列与重复对象
从 n 个不同对象无放回选 r 个有序对象:
各位置可选数逐次减一。阶乘是至 n 的正整数积,。全排列有 n!,选择零个有一个空结果,r>n 无放回则零,阶乘公式只声明于允许范围。
A、B、C 填两个具名位置,无放回为 AB、AC、BA、BC、CA、CB,共六。可放回则增加 AA、BB、CC,共九,一般 。同一对象可占多个位置,与不同对象碰巧标签相同不同。
标签相同且不可区别时,不同具名排列可表示同一标签串。A、A、B 只有 AAB、ABA、BAA 三种。暂给两个 A 命名得到六,每个标签串恰好两个表示,所以除共同倍数给 。
一般 N 个对象、k 类标签次数 ,总和 N,完整标签排列数为 。分子计暂时具名对象,各同标签内部交换不改变标签串,每个串有相同内部交换积。固定次数与完整排列是前提。
不能随意除一个对称因子,须检查每结果表示数量相同。A、A、B 的部分二项选择中 AA 有一个具名位置构造,AB 有两个。三构造除猜测二并不得到正确的两个结果。
不同的含义取决于问题。同类别两记录通常仍是不同记录,交换具名角色改变记录结果,即使标签串不变。只观察类别会合并多个记录选择;转向概率前必须分开底层结果与表示。
放回有序公式 也要求每位 n 个允许选项。后续依赖先前时,应按实际分支计。密码禁止重复或必须含数字引入约束,n! 与 不自动处理,先定义构造再选公式。
边界检查 r=0、1、n、r>n 可揭错误。全标签相同的 N 对象只有一串,。得到零或 N! 表示区别模型不同或有建模错误。
四不同记录标签 A、A、B、B,有多少完整记录顺序与不同标签串?为何两答案都可正确?
查看答案
记录 ,标签 ,每标签串隐藏四个记录顺序,两者计不同结果集。
组合、二项式恒等式与子集
无序 r 元子集是组合,数为二项式系数:
每个不同对象的 r 子集恰有 r! 个有序排列,因此将 除此共同数,每子集一次。这是等表示倍数论证,不是脱离模型的公式。基本组合不保留顺序且禁止重复。
评估子集不分位置。有序构造 ,每子集出现六次,故 。若三位置不同职责,则除法会丢真实区别,正确仍 720。
{A,B,C} 选二时,AB 与 BA 同为 {A,B}。每二元子集两顺序,六有序结果变三子集。
补集把 r 子集双射到 n−r 子集,故 ,用固定 n 元全集。 分别计空与全;n>0 时不表示它们是同一对象。
帕斯卡恒等式区分一个具名 x:r 子集或不含 x,有 ;或含 x,其他成员有 。两情况不交且穷尽,故
n≥1 时将负选择数或超过非负上标的二项系数定义为零,就包含边界。分类证明解释恒等式与递推,不只是约掉阶乘。
二项式定理连接子集与代数:
n 个因子中,恰 r 个位置取 b、其余取 a,有 个位置子集产生该单项式。零次幂两边一,用空乘积。这里 a、b 是可交换标量;矩阵顺序有意义,需额外条件。
取 a=b=1,得 ,按不交子集大小计幂集,连接模块 03 的选入/不选入。两个有依据的方法计同一集合称双重计数证明。
两具名组中每记录恰属一组,选 r 决定补组。固定大小训练、验证、测试三组用多项式计数而非单个组合数;主体、时间与资格限制又减少允许划分。正确无约束数不自动是应用数。
连续均匀无放回选择后丢弃顺序可生成均匀子集:每有序序列等权,每子集恰 r! 个序列,合并权重相同。两性质都需要。若某阶段偏好某记录,即使总返回 r 个不同记录,也可使子集有偏。应把“随机”改成明确机制再赋概率。
普通集合不记录次数:{A,A,B} 与 {A,B} 同集。多重集保留两个 A、一个 B,可用次数元组或排序标签列表表示。探索器用双括号表示多重集,与子集花括号区别。规范排序去顺序却保留重复;再转集合会丢另一区别并改变计数。把表示作枚举键前先检查是否符合结果定义。
用双射解释 ,并按位置给 中 系数。
查看答案
每四元子集恰遗漏一个,补集双射。三 b 位置有 ,系数十。
重复、隔板法与约束
n 个相同任务给 k 位具名工人,即非负整数元组 和为 n。任务不可区别、工人可区别、允许零,数为
隔板法(stars and bars)用 n 星代表任务、k−1 板分隔各工人份额。板可在端点或相邻,表示零。共 n+k−1 位置,选板位置唯一决定字符串;每分配也唯一产生字符串,双射证明公式。
(2,1,2) 写 **|*|**,七位含五星两板,数 。允许零,(0,5,0) 为 |*****|。若任务各有身份,每任务选一工人,有 不同分配,不是同模型。
两板规定三位具名工人的份额,移板改变分配,相同星不带任务身份。
n 种类型无序选 r 个允许重复,是同类非负计数: 为类型 i 次数,总 r,数 ,n≥1。保留顺序则 。丢顺序的表示倍数随重复变化,不能简单除 r!。
每工人至少一,可写 ,剩 n−k,n≥k 时数 ,否则零。一般下界 减去总下界,先检查可行再算阶乘。
上界不能这样直接消除。五任务、三工人、每人至多二:21 无约束分配中,指定工人至少三时减三,剩二任务给三人,有六。三禁集不可能两者重叠,因为至少六任务才行。有效 ,即 (2,2,1) 的排列。
这用补集与容斥,下一节展开。正确公式可能正确计其模型却解错题。上下界、工人具名与任务可区别性都是结构前提。
若工人不具名,(2,1,2) 与 (1,2,2) 可能同结果,具名公式过计。整数分拆是另一问题,不在核心。不能自动除 k!,相等份额与全不同份额的表示倍数不同。
零任务且 k≥1 有一个全零分配,与公式一致;要求正份额则无。零工人不在公式论域,可另规定零任务时一个空分配。异常域应明确。
五相同任务给三具名工人,每人至少一,变换并计数。具名任务为何另算?
查看答案
每人先减一,剩二,。具名任务有个体分配区别,份额模型合并这些结果,不能直接计它们。
容斥、补集与抽屉原理
A、B 重叠时,加大小使交集计两次,减一次得 。四成员区域:仅 A、仅 B 各贡献一;交区贡献 ;都不属于贡献零。解释修正比只背公式有用。
三集合加单项、减两两交、加三交:
三者都属的成员先三、减三、加一;恰属二者贡献二减一;恰属一贡献一。这些不交情况覆盖证明。更多集合交项交替,小模型有时枚举更简单。
二十记录中八有 A、七有 B、三都有,并集 ,补集八。直接十五重复计共享三项;补集只关于该二十记录全集。
补集计数从总数减所求反面。至少一个碰撞的反面是全部桶不同,更易计。两情况应在共同全集中不交且穷尽;只补不完整失败列表会遗漏无效情况。
抽屉原理(pigeonhole principle)给保证而非概率。n 对象放 m 箱且 n>m,至少一箱有两个。若每箱至多一,总数至多 m,矛盾。m>0 时一般某箱至少 ,否则达不到总数。
五项放四桶必碰撞,无论规则与均匀性。三项四桶可碰却非必,可有不同桶。计数与抽样描述概率;容量未超时抽屉不提供保证。高概率与确定不同。
模块 04 的分类与反证支撑工具。容斥追踪每成员情况的系数,抽屉假设所有箱不足再推总数矛盾。新约束改变可能情况时不能被简短公式遮蔽。
不同容量 的箱,超过总容量必某处溢出,是同一反证。不指出哪箱;少于总容量也不保证具体分配无溢出。可行分配存在与所选分配行为不同。
选择最易且有依据的计数:小重叠减交,至少一个看零个补,必重复比较容量。先命名数量并检查边界,常比做大算术更快揭模型错误。
七项三箱,保证哪里至少多少?是否指定箱?用反证解释。
查看答案
某箱至少三。若全至多二总至多六,矛盾。只证明某箱存在,不指定名字。
有限概率需要抽样模型
有限样本空间 含模型全部结果,事件 E 是子集。均匀模型给每结果 ,于是 。比值以前提等可能为条件,有限结果集本身不分配概率。
不等概率需给非负权重 总和一,。确定规则极端地给一结果一、其余零。计可能结果数不能区别它与均匀抽取,机制必须纳入模型。
三具名项独立均匀选四桶,结果为有序三元组,共 等可能。无碰撞 ,故碰撞 。三不超过四,可碰且概率较大,却不保证。
均匀有序三元组有 64 结果:24 全不同、40 碰撞。只有模型给相同权重时计数才变成概率。
k 项独立均匀选 m 桶, 时无碰撞 ,补得碰撞。k=0 空积一,碰撞零;k>m 抽屉保证,与均匀无关。真实哈希在固定数据上未必独立均匀,公式是模型计算,不自动描述每实现。
独立使完整三元组概率为阶段概率积 。若所有项复制同一个随机均匀桶,每项单独均匀,却相依且三项必碰。均匀边缘不保证独立联合模型。
合并表示也破坏均匀性。A、A、B 三个具名位置均匀选无序二位置,三个等可能对,一个给 AA,两个给 AB,观察概率 1/3 与 2/3。不能把 {AA,AB} 当均匀。映射到观测时,把全部原像权重相加保存概率。
模拟抽样指定机制并报告频率,可检查预测与实现,有限频率不必等于精确概率。固定种子复现一次运行,不把样本变成枚举。后续研究抽样误差与集中;这里分开报告精确数、模型概率、样本比例。
实验穷尽 64 元组,再按同模型抽一万次。改变权重、相关性或碰撞定义,就改变机制或事件,应重新计算。接近公式的图不解释模型为何适用,比较数字前写前提。
这些基础支持搜索空间、碰撞、数据划分与有限不确定性。共同习惯是先定义结果再算;概率还需先定义选择机制再谈机会。这是本模块的核心结业能力。
三项全复制一个共同均匀桶,每项单独均匀,碰撞仍 5/8 吗?哪个假设失败?
查看答案
必碰。完全相依,仅四个全相同元组发生,不是 64 元组等可能。独立均匀而非仅各自均匀才支持 5/8。
常见误解
| 症状 | 原因 | 修复 |
|---|---|---|
| 子集计数过大 | 保留具名位置 | 证明每子集 r! 个顺序 |
| 标签重复过计 | 把同标签当不同 | 定义观测结果与表示倍数 |
| 重叠标签直接加 | 共享计两次 | 同全集容斥 |
| 隔板忽略上界 | 计无约束分配 | 下界变换后修正上界禁集 |
| 有限结果全等概率 | 混淆有限与均匀 | 声明权重机制 |
| 每项均匀就用独立公式 | 漏依赖 | 检查联合构造 |
| 可能性大称必然 | 混淆概率与保证 | 比容量与是否仍有无碰结果 |
实验设置与模型解释
Python 3.11 或更新,无需包,见入门。itertools 构造有限序列与子集,math.comb 供精确整数参照,Fraction 保留精确概率。先解释结果模型。每次十分:预测三、计数/模型解释四、变化或故障三。
实验 1 枚举选择
四十分钟:预测二进制串、六有序对、三子集、五任务分配,运行后指出每行的不同标准。解释零选择。把具名二位置改为无序无放回并证明除二。十选三枚举确认 120 与 720,但不替代推导。
"""Count ordered, unordered, and repeated choices over small explicit domains."""
from itertools import combinations, permutations, product
from math import comb, factorial
def main():
binary = ["".join(bits) for bits in product("01", repeat=4)]
assert len(binary) == 2 ** 4
print("Length-four binary strings:", len(binary))
print("Ordered two from ABC:", ["".join(p) for p in permutations("ABC", 2)])
print("Unordered two from ABC:", ["".join(p) for p in combinations("ABC", 2)])
for n, r in ((3, 2), (5, 0), (5, 3), (10, 3)):
ordered = len(list(permutations(range(n), r)))
unordered = len(list(combinations(range(n), r)))
assert ordered == factorial(n) // factorial(n - r)
assert unordered == comb(n, r)
print(f"n={n}, r={r}: ordered={ordered}, unordered={unordered}")
allocations = [(a, b, 5 - a - b) for a in range(6) for b in range(6 - a)]
assert len(allocations) == comb(7, 2)
print("Five identical tasks across three named workers:", len(allocations))
print("First five allocations:", allocations[:5])
if __name__ == "__main__":
main()
Length-four binary strings: 16
Ordered two from ABC: ['AB', 'AC', 'BA', 'BC', 'CA', 'CB']
Unordered two from ABC: ['AB', 'AC', 'BC']
n=3, r=2: ordered=6, unordered=3
n=5, r=0: ordered=1, unordered=1
n=5, r=3: ordered=60, unordered=10
n=10, r=3: ordered=720, unordered=120
Five identical tasks across three named workers: 21
First five allocations: [(0, 0, 5), (0, 1, 4), (0, 2, 3), (0, 3, 2), (0, 4, 1)]
实验 2 精确与模拟碰撞
四十分钟,第 6 节后:预测 64 元组、40 碰撞、5/8。运行比较样本比例,种子复现而不证明频率等于概率。改为五项四桶,无碰数须零、必碰;应更新无碰公式,不能保留三项表达式。讨论相关机制为何使独立公式失效。
"""Uniform independent bucket choices: exact enumeration and a seeded sample."""
from fractions import Fraction
from itertools import product
from random import Random
def main():
buckets, items = 4, 3
outcomes = list(product(range(buckets), repeat=items))
collisions = sum(len(set(outcome)) < items for outcome in outcomes)
exact = Fraction(collisions, len(outcomes))
no_collision_count = buckets * (buckets - 1) * (buckets - 2)
assert exact == 1 - Fraction(no_collision_count, buckets ** items)
print("Model: 3 named items choose independently and uniformly among 4 buckets.")
print("Total outcomes:", len(outcomes), "collision outcomes:", collisions)
print("Exact probability:", exact, "=", float(exact))
rng = Random(2026)
trials = 10000
observed = 0
for _ in range(trials):
outcome = [rng.randrange(buckets) for _ in range(items)]
observed += len(set(outcome)) < items
estimate = observed / trials
print(f"Seed=2026, trials={trials}, observed collision fraction={estimate:.4f}")
print("A sampled fraction is not the exact probability or a collision guarantee.")
if __name__ == "__main__":
main()
Model: 3 named items choose independently and uniformly among 4 buckets.
Total outcomes: 64 collision outcomes: 40
Exact probability: 5/8 = 0.625
Seed=2026, trials=10000, observed collision fraction=0.6188
A sampled fraction is not the exact probability or a collision guarantee.
实验 3 重复标签与观察权重
四十分钟:预测 A、A、B 的完整标签串与二项倍数。解释全排列除二有效,而两观测各一半无效。运行保存两概率,描述三个等可能位置对映到两标签结果。改为 A、B、C,映射不合并位置对,所以各观察等权。
"""Distinguish named positions from repeated labels and preserve sampling weights."""
from collections import Counter
from fractions import Fraction
from itertools import combinations, permutations
from math import factorial
def main():
labels = ("A", "A", "B")
raw = list(permutations(labels))
unique = sorted({"".join(outcome) for outcome in raw})
assert len(raw) == 6 and len(unique) == factorial(3) // factorial(2)
print("Named-position permutations:", len(raw))
print("Distinct label strings:", unique, "count=", len(unique))
selected = Counter("".join(sorted(pair)) for pair in combinations(labels, 2))
print("Uniform pair of named positions; label multiplicities:", dict(sorted(selected.items())))
total = sum(selected.values())
for outcome, count in sorted(selected.items()):
print(" ", outcome, "probability=", Fraction(count, total))
print("Two possible label outcomes are not automatically equally likely.")
print("Repair the count by defining whether positions, records, or labels are distinct.")
if __name__ == "__main__":
main()
Named-position permutations: 6
Distinct label strings: ['AAB', 'ABA', 'BAA'] count= 3
Uniform pair of named positions; label multiplicities: {'AA': 1, 'AB': 2}
AA probability= 1/3
AB probability= 2/3
Two possible label outcomes are not automatically equally likely.
Repair the count by defining whether positions, records, or labels are distinct.
练习与完整解答
练习 1–12 共 110 分钟、每题五分;扩展额外 25 分钟。先给结果与前提,再算;错误模型的正确数不能满分。
计四位二进制串及恰二个一的串,解释限制。
查看解答
全部十六,恰二选位置 。都保留位置,后者限制允许串。
十不同记录选三,分别具名角色与无序子集。
查看解答
角色 720,每子集六顺序,子集 120。均无放回。
计 A、A、B、B 完整标签串,为何 24 是另一问题?
查看解答
;24 对同标签对象也分别命名,保留标签串丢弃的区别。
二十记录八 A、七 B、三都有,计并与补。
查看解答
并十二,补八。减交移除每共享记录的第二次计数。
区分一个对象证明帕斯卡恒等式,为何两情况可加?
查看解答
r 子集不含指定项有 ,含它有 。不交且穷尽相加,边界无效选择数为零。
两方法证明三元集八子集,并连接 。
查看解答
每成员选/不选八模式;按大小 。一般同一幂集有 编码,各不交大小类 ,双重计数证明。
证明七项三箱某箱至少三,区别具名箱主张。
查看解答
全至多二则总至多六,与七矛盾。证明某箱存在,不指定箱也不赋概率。
五相同任务三具名工人,允许零与每人至少一分别计数。
查看解答
无约束 21;各减一剩二,六。任务相同、无上界。
同问题每人至多二,用排除禁集推导。
查看解答
21 总,指定人至少三有六,三人禁集不能重叠,故三,(2,2,1) 排列。
三独立均匀项选四桶,算碰撞并解释非保证。
查看解答
64 等可能元组,24 全不同,补 5/8。三未超四且有全不同元组,非抽屉必然。
A、A、B 均匀选二具名位置,报告 AA、AB 各半,修复。
查看解答
三个位置对等可能,一个 AA、两个 AB,所以 1/3、2/3。合并标签改变权重,两观测非自动均匀。
三项复制同一均匀桶,因各项均匀就用独立公式。诊断与真概率?
查看解答
相依,仅四全同元组,全碰概率一。单独均匀不能使独立模型 64 元组等可能。
可选:按因子位置推导 的 系数,解释零。
查看解答
选 r 个 b 位置,其余 a,系数 ,要求标量可交换。零时空积一,唯一零项系数一。
可选:十不同记录分具名大小 5、3、2 组,什么新约束使数失效?
查看解答
先选五再剩五选三,最后二,。同主体必须同组会删除记录划分,需约束模型。
自测题
九自动选择,书面模型解释自评供剩一分。反馈提醒计数前提。
查看答案
均匀选三个具名位置中的二个,三个位置对等可能;一映 AA、二映 AB,观察概率 1/3、2/3。必须声明底层模型并合并原像权重才得分,仅说有的更常见不够。
引导阅读
必读十五分钟:在 MIT Mathematics for Computer Science 教材中阅读乘法、加法、子集计数,先说明一例顺序与重复再选公式。
必读二十分钟:阅读容斥与有限概率介绍,指出等可能假设位置,按成员情况重述重叠修正,区别计数与抽样概率。
选读:比较官方 itertools 组合迭代器 的顺序与放回约定,查看 math.comb 的精确整数参照。推导、例子与图原创。
复习与增长分析准备
结果定义决定计数:不交选择、构造分支或双射。有序、子集、多重集保留不同区别。容斥修重叠、补集计简单反面、抽屉给容量保证。概率增加权重,均匀才支持计数比。
结业任务:推导十选三有序与无序,证明帕斯卡,计约束任务分配,解释独立碰撞及相依反例。练习六十、实验三十、测验十分。算前写前提,反馈后修复区别。
模块 06 研究和、增长、递推。先解释搜索空间计数为何不自行确定某算法操作数,保留有限和归纳与乘法论证。
记法与双语术语
| 术语或符号 | 含义 | English |
|---|---|---|
| $ | A | $ |
| 加法 / 乘法 | 不交替代 / 后续选择 | Sum / product rule |
| 阶乘、无放回排列 | Factorial, permutation | |
| 不同无序 r 子集 | Binomial coefficient | |
| 多重集 | 成员带重复次数 | Multiset |
| 隔板法 | 非负整数分配双射 | Stars and bars |
| 容斥 | 修正重叠计数 | Inclusion–exclusion |
| 抽屉原理 | 超容量强制重复 | Pigeonhole principle |
| 样本空间 / 事件 | 模型结果 / 结果子集 | Sample space / event |
| 均匀 / 独立 | 等权 / 乘积抽样结构 | Uniform / independent |
| 精确概率 / 频率 | 模型权重 / 样本比例 | Exact probability / observed frequency |