假如你刚被聘为学校礼堂的灯光师。控制台上是一排排开关,每一盏灯对应一个座位号;开关拨上灯亮,拨下灯灭。你不需要记住每盏灯的长相,只需要一张“亮灯清单”:每个位置上记 1 表示亮、记 0 表示灭。这张清单,就是今天故事的主角——特征函数。有了它,复杂的集合操作(两批灯同时亮、串联、反接)全部变成简单的 0 和 1 算术;清点亮灯数量时,重叠的灯光也不会被重复统计。本文从这张开关清单出发,讲清特征函数如何把集合运算翻译成代数式,如何证明容斥原理、解决整除计数,并一路连接到生成函数,最终落成算法工程师手中处理位图索引、布隆过滤器等真实问题的数学工具。

岗位关联

对 AI 从业者而言,特征函数是“集合 → 0/1 数组”的底层直觉,让你写位图、布隆过滤器、容斥计数代码时知其所以然,是组合分析最轻巧的敲门砖。

目录
  1. 可视化演示
  2. 特征函数定义
  3. 集合运算转化
  4. 关系与判定
  5. 容斥原理证明
  6. 计数应用场景
  7. 生成函数联系
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

特征函数法利用特征函数将集合运算转化为代数运算,简化组合计数。本文详解特征函数的定义、集合运算的特征函数表示、... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

特征函数的定:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

特征函数定义

灯光师上岗第一天,师傅递给你一块控制面板:十二个开关,对应十二盏射灯。你拨了一个下午,最终在值班表上写下“3 号亮、5 号亮、7 号灭……”。这张值班表不需要描述灯本身的样子,只需要回答一个问题:这个位置,亮,还是不亮? 数学里,这张表就叫特征函数。

把“亮”记为 1、“灭”记为 0,那么任意子集 A 都可以被一条 0/1 规则完全描述。这条规则就是特征函数 \(\mathbb{1}_A\):输入一个元素,输出它在不在集合里。它不关心元素长什么样,只关心“归属”这一个事实。值与值的跳变,天然构成对集合的完整编码——两个集合相等,当且仅当它们的特征函数处处相同;反过来,任何一条 0/1 规则也必然对应唯一一个集合。这种一一对应,是特征函数法一切威力的根基。

有了这张清单,灯光师接下来做任何操作都有了“翻译底稿”:把集合关系变成算术,把算术结果再翻译回集合结论。这正是特征函数法的全部心法——先编码,再计算,最后解码。

1A(x)={1,x∈A0,x∉A\mathbb{1}_A(x) = \begin{cases} 1, & x \in A \\ 0, & x \notin A \end{cases}
特征函数就是“亮灯清单”的数学写法:属于集合则记 1,不属于则记 0,与灯光师的值班表如出一辙。
  1. 设定考察对象从全集 U 中任取一个元素 x,作为待判定的座位号。
    x∈Ux \in U
  2. 属于集合的情形当 x 确实落在集合 A 中,特征函数给出 1,就像开关拨到亮。
    x∈A⇒1A(x)=1x \in A \Rightarrow \mathbb{1}_A(x) = 1
  3. 不属于集合的情形当 x 不在集合 A 中,特征函数给出 0,就像开关拨到灭。
    x∉A⇒1A(x)=0x \notin A \Rightarrow \mathbb{1}_A(x) = 0

集合运算转化

灯光师开始排练节目:方案 A 是一组亮灯,方案 B 是另一组亮灯。导演要求“两组灯的并集”亮起,也就是只要任一方案点亮的座位都要亮。你不可能逐个座位去问“你属于 A 吗?你属于 B 吗?”,最好的办法是把两张清单合在一起做算术。

两张清单同一位置上的数字相加,会出现 0、1、2 三种结果。可灯只有亮和灭两态,数字 2 是非法状态。怎么办?灯光师的办法是:先加,再把重叠处多算的那一次减掉。两行同为 1 的位置,相加得 2,恰好减掉 1 就修复成 1。这个修复项正是交集的特征函数。由此得到并集的代数表达式:

其他运算同样可以翻译:交集是两行相乘 \(\mathbb{1}_{A \cap B}(x) = \mathbb{1}_A(x)\,\mathbb{1}_B(x)\),只有两路同时导通灯才亮,这是标准的“并联”逻辑;补集是反相器 \(\mathbb{1}_{A^c}(x) = 1 - \mathbb{1}_A(x)\);差集则是先反相再相乘 \(\mathbb{1}_{A \setminus B}(x) = \mathbb{1}_A(x)(1 - \mathbb{1}_B(x))\)。至此,灯光师手里的开关电路彻底化成了小学算术。

1A∪B(x)=1A(x)+1B(x)−1A(x) 1B(x)\mathbb{1}_{A \cup B}(x) = \mathbb{1}_A(x) + \mathbb{1}_B(x) - \mathbb{1}_A(x)\,\mathbb{1}_B(x)
并集 = 两行相加再减去重叠的一次计数,等价于“串联电路”:任何一路导通,灯就亮。
  1. 两行状态相加同一座位在两份清单上的 0/1 值求和,得到 0、1 或 2。
    1A(x)+1B(x)\mathbb{1}_A(x) + \mathbb{1}_B(x)
  2. 减去重叠修复项仅有同时为 1 时结果才需要减 1,乘积项精确命中这一情形。
    −1A(x) 1B(x)-\mathbb{1}_A(x)\,\mathbb{1}_B(x)
  3. 乘积即交集两个 0/1 值相乘,只有在都为 1 时才为 1,这正是交集的特征函数。
    1A(x) 1B(x)=1A∩B(x)\mathbb{1}_A(x)\,\mathbb{1}_B(x) = \mathbb{1}_{A \cap B}(x)
  4. 四类情形验证两数的 0/1 组合共四种,代入后结果始终落在 0/1 值域内。
    (a,b)∈{0,1}2⇒a+b−ab∈{0,1}(a,b) \in \{0,1\}^2 \Rightarrow a + b - ab \in \{0,1\}

关系与判定

彩排结束,导演想确认两件事:方案 A 的所有亮灯,是不是方案 B 都有?两份方案是不是完全一样?逐盏跑遍全场太累,灯光师的聪明做法是逐点比较两张清单的对应格子。

如果每当 A 的某个位置记为 1 时,B 的同一位置也必然为 1,那就说明“凡是 A 亮的座位 B 都亮”,即 \(A \subseteq B\)。数学上写成逐点不等式:对全集中的每个元素,A 的特征函数不超过 B 的特征函数。这个判据不依赖任何枚举技巧,把集合包含问题变成了纯粹的数值比较——就像核对两张值班表时,眼睛只需盯住“1 对 0”的违例,其余全部忽略。

相等判定随即而来:既然 \(A \subseteq B\) 且 \(B \subseteq A\) 同时成立才叫相等,那么只需验证 \(\mathbb{1}_A = \mathbb{1}_B\) 逐点成立。更妙的是,包含关系可以做加减运算——比如要证 \(A \subseteq B\),可以转化为证 \(\mathbb{1}_A \cdot (1 - \mathbb{1}_B) = 0\) 恒成立,这就是“集合方程”的雏形。灯光师不再需要眼睛盯着灯,只需要盯着数字。这种“把集合命题翻译成代数恒等式”的手法,正是特征函数法最具穿透力的地方。

A⊆B⟺∀x∈U, 1A(x)≤1B(x)A \subseteq B \quad \Longleftrightarrow \quad \forall x \in U,\ \mathbb{1}_A(x) \le \mathbb{1}_B(x)
包含判定 = 逐点检查“A 亮处 B 必亮”,等价于说差集为空,是“亮灯清单”之间的数值比较。
  1. 逐点扫描全集对 U 中每一个元素,都做一次开关状态的比较。
    ∀x∈U\forall x \in U
  2. 亮灯包含保证A 为 1 的位置 B 必须为 1,A 为 0 时则不加限制。
    1A(x)≤1B(x)\mathbb{1}_A(x) \le \mathbb{1}_B(x)
  3. 等价为差集为空若存在 A 亮而 B 灭的位置,则说明 A 含有 B 外元素。
    A∖B=∅⟺1A≤1BA \setminus B = \varnothing \Longleftrightarrow 1_A \le 1_B

容斥原理证明

舞台上有两束探照灯,一束照集合 A 的座位,一束照集合 B 的座位。导演问你:观众席上总共有多少个座位被至少一束灯照到?新手会先数 A 再数 B,发现重叠区被数了两遍,于是不得不狼狈地重数。老灯光师的做法是:打开控制台,直接调用并集特征函数的恒等式。

回顾并集公式 \(\mathbb{1}_{A \cup B} = \mathbb{1}_A + \mathbb{1}_B - \mathbb{1}_A\mathbb{1}_B\),它是对每个座位都成立的逐点等式。现在对全场的所有座位求和:左边是“被照到的座位总数”,右边三项分别是 A 的座位数、B 的座位数、重叠区座位数。于是“先加再减”的朴素经验,被一条代数恒等式焊死成了定理——这就是容斥原理最干净利落的证明。

推广到三个集合也同样自然:三束灯光叠加,两两重叠减一次,但三束共同照到的区域被多减了一次,要加回来。于是得到 \(|A \cup B \cup C| = |A|+|B|+|C| - |A\cap B| - |A\cap C| - |B\cap C| + |A\cap B\cap C|\)。特征函数法的好处在这里尽显:只要写出并集特征函数的展开式,符号全靠代数展开决定,不再需要画韦恩图数来数去。

∣A∪B∣=∣A∣+∣B∣−∣A∩B∣|A \cup B| = |A| + |B| - |A \cap B|
容斥原理 = 并集特征函数两边在全集上求和:加两单集、减重叠,正是灯光师“避免重复点亮”的算术化。
  1. 写出并集恒等式用特征函数表示并集的逐点状态。
    1A∪B(x)=1A(x)+1B(x)−1A(x)1B(x)\mathbb{1}_{A \cup B}(x) = \mathbb{1}_A(x) + \mathbb{1}_B(x) - \mathbb{1}_A(x)\mathbb{1}_B(x)
  2. 两边对全集求和在全集上逐元素累加,左边正是并集中元素的个数。
    ∑x∈U1A∪B(x)=∣A∪B∣\sum_{x \in U} \mathbb{1}_{A \cup B}(x) = |A \cup B|
  3. 特征函数求和即基数任意集合 C 的 0/1 指示函数加起来,恰好等于 C 的元素数。
    ∑x∈U1C(x)=∣C∣\sum_{x \in U} \mathbb{1}_C(x) = |C|
  4. 合并得容斥公式把和的线性拆开,乘积项对应交集基数。
    ∑x∈U1A(x)+∑x∈U1B(x)−∑x∈U1A∩B(x)=∣A∣+∣B∣−∣A∩B∣\sum_{x \in U} \mathbb{1}_A(x) + \sum_{x \in U} \mathbb{1}_B(x) - \sum_{x \in U} \mathbb{1}_{A \cap B}(x) = |A| + |B| - |A \cap B|

计数应用场景

灯光师终于接到第一个实战单子:剧场 100 个座位,编号 1 到 100,导演要求统计“编号能被 3 整除或能被 5 整除”的座位上需要放节目单。逐个数当然可以,但灯光师直接用特征函数法:设 A 为 3 的倍数集合,B 为 5 的倍数集合,问题就是求 \(|A \cup B|\)。单集合大小由下取整直接给出,交集则是 15 的倍数集合。

这个思想还能延伸到错位排列:设 \(A_i\) 表示“第 i 个位置仍放原元素”的排列集合,则错位排列数就是全排列扣除所有 \(A_i\) 的并集,容斥给出 \(D_n = n! \sum_{k=0}^{n} (-1)^k / k!\)。在工程实现中,特征函数的 0/1 数组直接映射为计算机的位图——集合求交就是按位与,求并就是按位或,一次机器指令处理 64 个元素;布隆过滤器更是把特征函数思想推向概率化,用 k 个哈希位近似回答“元素是否缺席”,以极小误判率换来了海量数据下的内存节省。

⌊100/3⌋+⌊100/5⌋−⌊100/15⌋=33+20−6=47\lfloor 100/3 \rfloor + \lfloor 100/5 \rfloor - \lfloor 100/15 \rfloor = 33 + 20 - 6 = 47
整除计数是容斥原理的经典应用:能整除 3 或 5 的座位数 = 33 + 20 − 6 = 47,重叠的 15 的倍数只算一次。
  1. 定义两个集合A 是 3 的倍数座位,B 是 5 的倍数座位,目标是 \(|A \cup B|\)。
    A={n≤100:3∣n},B={n≤100:5∣n}A = \{n \le 100 : 3 \mid n\},\quad B = \{n \le 100 : 5 \mid n\}
  2. 分别求单集合大小每 k 个座位出现一个倍数,用下取整函数数出个数。
    ⌊100/3⌋=33,⌊100/5⌋=20\lfloor 100/3 \rfloor = 33,\quad \lfloor 100/5 \rfloor = 20
  3. 求交集大小同时被 3 和 5 整除,即被最小公倍数 15 整除。
    ⌊100/15⌋=6\lfloor 100/15 \rfloor = 6
  4. 代入容斥公式单集合之和减去重叠计数,得到最终答案。
    33+20−6=4733 + 20 - 6 = 47

生成函数联系

灯光师发现,逐盏查灯虽然精确,但遇上几千个座位就嫌慢。他想要一块总电表:输入整张亮灯清单,一秒钟读出“总共亮了多少盏”。特征函数已经提供了答案雏形——\(\sum_{x \in U} \mathbb{1}_A(x) = |A|\)。但真正让这块电表变得强大的,是给每个座位装一个“权重的砝码”:编号为 x 的座位,其砝码是 \(t^x\)。把亮灯(1)的砝码全部累加,就得到集合 A 的生成函数。

这条桥梁把组合计数送进了更广阔的代数世界。筛法思想就是典型:要数出区间内素数的个数,先给每个整数挂一个“是否素数”的特征函数,再通过容斥把合数的特征函数一层层剥掉,最终得到形如 \(\sum_{n \le x} \mathbb{1}_{\mathbb{P}}(n)\) 的加权和。特征函数提供逐点判定的开关,生成函数提供整体求值的电表,两者联手构成组合分析的标准双引擎——前者负责精确到点的“有没有”,后者负责汇总成式的“有多少”。

∣A∣=∑x∈U1A(x)=GA(1),GA(t)=∑x∈U1A(x) t x|A| = \sum_{x \in U} \mathbb{1}_A(x) = G_A(1),\qquad G_A(t) = \sum_{x \in U} \mathbb{1}_A(x)\, t^{\,x}
生成函数是“带电表的亮灯清单”:把特征函数按元素加权成多项式,令 t=1 时自动回落成集合基数。
  1. 按元素加权每个元素 x 对应一个单项式 \(t^x\),在集合内则计入,不在则不计。
    GA(t)=∑x∈U1A(x) txG_A(t) = \sum_{x \in U} \mathbb{1}_A(x)\, t^x
  2. 代入 t = 1所有单项式变为 1,加权和信息量坍缩为纯计数。
    GA(1)=∑x∈U1A(x)G_A(1) = \sum_{x \in U} \mathbb{1}_A(x)
  3. 与基数接轨特征函数求和等于集合大小,生成函数在 t=1 处恰好复现这一事实。
    ∑x∈U1A(x)=∣A∣\sum_{x \in U} \mathbb{1}_A(x) = |A|

AI 应用场景

大数据平台中的位图索引

阶段:数据预处理与特征检索

解决的问题:广告平台需要频繁查询“看过广告 A 且看过广告 B 的用户群”规模。传统 SQL JOIN 在大规模用户表上耗时数秒甚至分钟,无法支撑实时竞价。

具体案例:某广告系统维护一张位图索引,每个广告对应一个长度数亿的 0/1 比特数组——这正是一份特征函数。求交集人群只需对两个比特数组执行按位与,再统计 1 的个数,毫秒级返回人群规模。位图索引已成为 ClickHouse、Druid 等大数据引擎的标配结构。

网络爬虫与缓存中的布隆过滤器

阶段:数据清洗与去重

解决的问题:搜索引擎爬虫要对数十亿 URL 判重,精确存储全集不合算;缓存系统要快速决定“这个 key 一定不在缓存中”,避免穿透数据库。布隆过滤器用 k 个哈希函数把元素映射到 m 位数组,本质上是一条概率化的特征函数。

具体案例:某资讯 App 的推荐服务在 Redis 前加一层布隆过滤器,对未命中的请求直接拒绝,缓存命中率提升 30%,数据库压力减半。它回答“一定不在”时 100% 准确,回答“可能在”时容忍极低误判率。

组合优化中的容斥计数

阶段:算法设计与状态枚举

解决的问题:组合优化问题的状态空间常被多个互斥条件同时约束,直接枚举指数爆炸。容斥原理将“至少满足一个条件”的计数转化为若干单条件计数的加减组合。

具体案例:某量化团队计算 n 个资产的错位配置方案数(没有任何资产留在原仓位),用错位排列公式 \(D_n = n!\sum(-1)^k/k!\) 精确计数;某密码学项目用欧拉函数 \(\varphi(n)\) 统计与 n 互素的整数个数,其核心证明同样依赖特征函数的筛法拆解。

Python 演示

python47 行
def characteristic(items, universe):    """把集合 items 翻译成全空间 universe 上的特征函数(0/1 字典)"""    return {x: (1 if x in items else 0) for x in universe}  def union_char(fA, fB):    """并集特征函数:1_union = 1_A + 1_B - 1_A * 1_B"""    return {x: fA[x] + fB[x] - fA[x] * fB[x] for x in fA}  def intersect_char(fA, fB):    """交集特征函数:1_inter = 1_A * 1_B"""    return {x: fA[x] * fB[x] for x in fA}  def complement_char(f, universe):    """补集特征函数:1_comp = 1 - 1_A"""    return {x: 1 - f[x] for x in universe}  def size(f):    """特征函数在全集上求和,得到集合元素个数"""    return sum(f.values())  def main():    U = list(range(1, 101))    A = characteristic({x for x in U if x % 3 == 0}, U)    B = characteristic({x for x in U if x % 5 == 0}, U)     union = union_char(A, B)    inter = intersect_char(A, B)     ans = size(union)    expect = len({x for x in U if x % 3 == 0 or x % 5 == 0})    print("1 到 100 中能被 3 或 5 整除的个数:", ans)    assert ans == expect == 47     assert size(union) == size(A) + size(B) - size(inter)    print("容斥原理验证通过: |A∪B| = |A| + |B| - |A∩B|")     comp = complement_char(A, U)    print("能被 3 整除集合的补集大小:", size(comp))  if __name__ == "__main__":    main()
目的:用 Python 字典模拟特征函数,实现并、交、补三种集合运算,并验证容斥原理与整除计数结果。
  1. return {x: (1 if x in items else 0) for x in universe}把集合翻译成 0/1 字典,对应灯光师手写的亮灯清单。
  2. fA[x] + fB[x] - fA[x] * fB[x]并集特征函数的加减乘公式,重叠处自动修复为 1。
  3. {x: fA[x] * fB[x] for x in fA}交集就是逐点相乘,两灯同时亮才输出 1。
  4. sum(f.values())对全集求和得基数,正是“特征函数求和 = 集合大小”这一心法的实现。
  5. assert size(union) == size(A) + size(B) - size(inter)程序自动验证容斥原理,数字替灯光师把关。

常见误区

误区我以为 \(\mathbb{1}_A(x)\) 和概率 \(P(x \in A)\) 差不多,取值范围可以从 0 到 1 连续变化,求和结果也应该在 0 到 1 之间。

正解特征函数是确定性标记,只取 0、1 两个离散值——灯泡只有明暗两态,绝无“半亮”。概率描述随机试验的统计规律,而特征函数针对固定的集合做一次判定。它在全集上的求和不是概率,而是集合的基数 \(|A|\)。混淆二者,会在容斥公式里算出“丢失”的计数。

为何常见:概率论中常用示性函数(indicator)记号,与特征函数外形相似,初学者极易张冠李戴。

误区既然并集是“把两个集合合起来”,那 \(\mathbb{1}_A(x) + \mathbb{1}_B(x)\) 不就直接是并集的特征函数吗?顶多多出来的 2 也没关系吧?

正解当 x 同时属于 A 和 B 时,两数相加得 2,超出特征函数的 0/1 值域,无法再参与后续乘法运算。必须减去交集项 \(\mathbb{1}_A \mathbb{1}_B\) 把 2 修复为 1。就像两束灯光重叠处只能算一次照明,不能点两遍。

为何常见:直觉上“合并 = 相加”在整数计数层面成立,但特征函数是逐点的 0/1 开关,加法会破坏值域约束。

误区容斥原理不就是 \(|A\cup B| = |A|+|B|-|A∩B|\) 吗?记住公式就行,至于为什么减交集、三集合时为什么最后要加回来,背系数表就好了。

正解特征函数法给出统一证明路径:先写并集恒等式,再对全集求和。三集合时系数来自代数展开 \(1 - (1-\mathbb{1}_A)(1-\mathbb{1}_B)(1-\mathbb{1}_C)\),符号完全由展开决定,无需死记。掌握“逐点恒等式 + 求和”这套工具,任意有限个集合的容斥都能现场推导。

为何常见:教材往往直接给出公式,省略了从特征函数出发的推导,导致学生把注意力放在背系数而非理解结构。

误区特征函数是组合计数用的技巧,应该只对有限集合有效,到了无穷集合或连续场景就派不上用场。

正解特征函数可定义在任意集合上,包含判定、容斥恒等式在无穷集同样成立。它与生成函数、筛法结合后,在解析数论(素数计数)、概率论(随机变量的示性分解)、测度论中都是底层语言。灯光师的开关面板只是一个有限缩影,背后是普适的编码思想。

为何常见:教材例子几乎都是有限集合的整除、排列问题,容易让人误以为方法本身受限于有限性。

面试题

Q1. 集合 A 的特征函数 \(\mathbb{1}_A(x)\) 的值域是?

单选题 · easy

  • A.\(\{0, 1\}\)← 正确答案
  • B.\(\{-1, 1\}\)
  • C.\([0, 1]\) 闭区间
  • D.全体非负整数

答案:A。特征函数是灯光师的值班表,只记录“亮”与“灭”两种状态,因此只能取 0 和 1。B 是符号函数的值域,C 是概率的取值范围,D 则会破坏逐点开关的语义。记住:灯泡没有半亮,特征函数没有中间值。

Q2. 已知 \(\mathbb{1}_A\)、\(\mathbb{1}_B\) 分别表示集合 A、B 的特征函数,则 \(\mathbb{1}_{A \cap B}(x)\) 等于?

单选题 · easy

  • A.\(\mathbb{1}_A(x) + \mathbb{1}_B(x)\)
  • B.\(\mathbb{1}_A(x) \cdot \mathbb{1}_B(x)\)← 正确答案
  • C.\(\mathbb{1}_A(x) - \mathbb{1}_B(x)\)
  • D.\(1 - \mathbb{1}_A(x)\)

答案:B。交集要求两路开关同时导通,逐点相乘即可:只有两者都为 1 时乘积才为 1。加法会产生 2 的非法值,减法和补集取反都描述的是其他集合运算。这正是“交集 = 乘法”的电路语言。

Q3. 补集 \(A^c\) 的特征函数 \(\mathbb{1}_{A^c}(x)\) 的表达式是?

单选题 · easy

  • A.\(-\mathbb{1}_A(x)\)
  • B.\(\mathbb{1}_A(x) + 1\)
  • C.\(1 - \mathbb{1}_A(x)\)← 正确答案
  • D.\(\mathbb{1}_A(x) \cdot \mathbb{1}_B(x)\)

答案:C。补集是反相器:原来亮(1)的变灭(0),原来灭(0)的变亮(1),恰好对应 \(1 - \mathbb{1}_A(x)\)。取负会得到非法值 -1,加一在 1 时溢出,乘法则与另一个集合 B 无关。灯光师拨动反相开关即可完成补集操作。

Q4. 若对全集 U 中每个元素 x 都有 \(\mathbb{1}_A(x) \le \mathbb{1}_B(x)\),则一定有?

单选题 · mid

  • A.\(A = B\)
  • B.\(A \subseteq B\)← 正确答案
  • C.\(B \subseteq A\)
  • D.\(A \cap B = \varnothing\)

答案:B。逐点不等式 \(\mathbb{1}_A \le \mathbb{1}_B\) 表示“A 亮处 B 必须亮”,这正是包含关系 \(A \subseteq B\) 的判据。相等还需要反向不等式也成立;若 B 有 A 没有的元素,反向不成立;交集为空则要求两行完全没有同时为 1 的位置,与不等式的宽松条件无关。

Q5. 1 到 100 的自然数中,能被 3 或 5 整除的数共有多少个?

单选题 · mid

  • A.53
  • B.47← 正确答案
  • C.40
  • D.33

答案:B。设 A 为 3 的倍数集合、B 为 5 的倍数集合,则 \(|A|=\lfloor100/3\rfloor=33\),\(|B|=\lfloor100/5\rfloor=20\),交集为 15 的倍数共 \(\lfloor100/15\rfloor=6\) 个。由容斥原理 \(|A\cup B|=33+20-6=47\)。选项 A 是 33+20 忘了减重叠,D 只算了 3 的倍数。

Q6. 在证明容斥公式 \(|A \cup B| = |A| + |B| - |A \cap B|\) 时,关键的一步是?

单选题 · mid

  • A.对 \(\mathbb{1}_A(x) + \mathbb{1}_B(x)\) 在全集上求和
  • B.对恒等式 \(\mathbb{1}_{A \cup B} = \mathbb{1}_A + \mathbb{1}_B - \mathbb{1}_A\mathbb{1}_B\) 两边在全集上求和← 正确答案
  • C.用数学归纳法穷举所有元素
  • D.直接数出并集中的元素再逐个配对

答案:B。证明的核心是把并集特征函数的逐点恒等式对全集逐元素累加,左边得 \(|A\cup B|\),右边三项分别对应 \(|A|\)、\(|B|\)、\(|A\cap B|\)。只对前两项求和会丢掉重叠修正项;归纳穷举对无穷集无效,也掩盖了代数结构。

Q7. 1 到 100 的自然数中,能被 2、3、5 中至少一个整除的数有多少个?

单选题 · hard

  • A.74← 正确答案
  • B.78
  • C.72
  • D.70

答案:A。三集合容斥:单集合 \(\lfloor100/2\rfloor+\lfloor100/3\rfloor+\lfloor100/5\rfloor=50+33+20=103\);两两交集 \(\lfloor100/6\rfloor+\lfloor100/10\rfloor+\lfloor100/15\rfloor=16+10+6=32\);三交集 \(\lfloor100/30\rfloor=3\)。答案 \(103-32+3=74\)。B 是忘了加回三交集,C、D 是交集减错产生的干扰值。

Q8. 关于特征函数,下列说法正确的有?

多选题 · mid

  • A.不同集合的特征函数不同,集合与特征函数一一对应← 正确答案
  • B.特征函数的取值必须是自然数
  • C.在全集上对特征函数求和等于该集合的元素个数← 正确答案
  • D.特征函数可以把集合的交运算转化为数值乘法← 正确答案

答案:ACD。A 正确,0/1 规则与子集构成双射;C 正确,逐点相加正是“亮灯总数”;D 正确,交集等价于逐点相乘。B 错误,特征函数值域严格为 \(\{0,1\}\),“必须是自然数”的表述过于宽泛,会允许 2、3 等非法值,破坏开关语义。

Q9. 用特征函数法将集合运算代数化,下列转化正确的有?

多选题 · hard

  • A.\(\mathbb{1}_{A \cup B} = \mathbb{1}_A + \mathbb{1}_B - \mathbb{1}_A \cdot \mathbb{1}_B\)← 正确答案
  • B.\(\mathbb{1}_{A \cap B} = \mathbb{1}_A \cdot \mathbb{1}_B\)← 正确答案
  • C.\(\mathbb{1}_{A \setminus B} = \mathbb{1}_A \cdot (1 - \mathbb{1}_B)\)← 正确答案
  • D.\(\mathbb{1}_{A^c} = -\mathbb{1}_A\)

答案:ABC。A 是并集的加减乘公式,B 是交集的乘法公式,C 是差集“先反相再相乘”的组合式,三者都保持 0/1 值域。D 错误,补集应为 \(1 - \mathbb{1}_A\),取负会产生 -1 的非法状态,如同反相开关拨出了“负亮度”。

Q10. 特征函数法适合用于哪些实际场景?

多选题 · mid

  • A.证明容斥原理并推导多集合公式← 正确答案
  • B.用位图(bitmap)加速大规模集合的交并查询← 正确答案
  • C.统计区间内满足整除条件的整数个数← 正确答案
  • D.求解多元线性方程组

答案:ABC。A 是特征函数法最经典的证明用途;B 是工程落地,0/1 数组直接映射按位与/或;C 是容斥计数的典型应用。D 与集合代数无关,线性方程组使用矩阵消元,特征函数管的是“元素归属”而非“变量系数”。