深夜的社区夜市里,阿城和阿雨各摆着一个甜品摊。阿城的菜单上写着:双皮奶、杨枝甘露、芋圆、姜撞奶;阿雨的菜单上写着:芋圆、姜撞奶、芝麻糊、蛋挞。两人想合作搞一次“甜品节”:把两张菜单合并成一张总菜单、找出两家都有的招牌甜品、把“只有自家才有的独家菜”做成爆款拼盘……这些围绕菜单的“合并、找共同、挑独有、做配对”的动作,正是离散数学里集合运算的核心。集合运算不只在数学课本里,它每天都在数据库查询、推荐系统去重、算法设计里悄悄运转。这篇文章我们就用两张甜品菜单,把并集、交集、差集、补集、对称差、幂集和笛卡尔积一网打尽。

岗位关联

集合运算是离散数学的基石,掌握它能让 AI 从业者更从容地设计特征工程、优化数据库查询、理解算法背后的组合逻辑——这是从“会用工具”走向“能造工具”的必修课。

目录
  1. 可视化演示
  2. 集合基本概念
  3. 并集与交集
  4. 差集与补集
  5. 对称差运算
  6. 运算律与德摩根
  7. 幂集与笛卡尔积
  8. 编程中的集合
  9. 典型应用场景
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

集合运算是离散数学的基础,包括并交差补与对称差运算。本文详解集合的表示方法、运算律与德摩根律、幂集与笛卡尔积,... 切换模式查看不同维度。

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

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

集合基本概念

阿城的甜品摊开张前,他先写了一张菜单:双皮奶、杨枝甘露、芋圆、姜撞奶。这张菜单就是一个“集合”——把一些有共同身份的对象(都是阿城会做的甜品)装进一个整体里。菜单上的每一道甜品叫“元素”,而“双皮奶在这张菜单上”这件事,数学上写成“双皮奶 ∈ A”,读作“双皮奶属于集合A”。

集合的表示方法有两种。一种叫列举法,像写菜单一样把所有元素列出来:A = {双皮奶,杨枝甘露,芋圆,姜撞奶}。另一种叫描述法,用一句“规则”说明什么甜品能入选:A = {x | x 是阿城能做的甜品},竖线读作“满足”。描述法特别适合元素很多或说不完的集合,如同菜单上写着“所有 10 元以内的甜品”,而不是一道道列出来。

最特殊的两个集合是空集和全集。空集记作 ∅,是“一张什么都没写的菜单”;全集 U 是“夜市全场所有能卖出的甜品目录”。空集看似无用,却是很多数学论证的起点;全集则给了我们讨论问题的边界。

所以你看,数学里的集合并没有那么神秘——它就是阿城贴在摊位上的那张菜单,花括号是菜单边框,x 是菜名,P(x) 是“会不会做”的判断标准。理解了这张菜单,后面的并集交集等“玩法”都会迎刃而解。

A={x∣P(x)}\displaystyle A = \{x \mid P(x)\}
这个公式就是“描述法”的标准符号:集合 A 等于所有满足条件 P 的 x 构成的整体。P(x) 是筛选规则,竖线“|”读作“使得”。
  1. 元素来源x 要从某个讨论范围内取出来,不能凭空产生
    x∈U\displaystyle x \in U
  2. 条件筛选只有让规则 P(x) 成立的对象才被收入集合
    P(x) 为真\displaystyle P(x) \ \text{为真}
  3. 整体收拢把筛选出的所有 x 用花括号包成一个整体
    A={x∣P(x)}\displaystyle A = \{x \mid P(x)\}

并集与交集

甜品节要办起来了,夜市管理方让阿城和阿雨把两张菜单合成一张“总菜单”。阿城有 4 道菜,阿雨有 4 道菜,但芋圆和姜撞奶两家都会做——总菜单不能把同一道菜写两遍,于是合并后一共是 6 道菜。这个“合并并去重”的动作,就是并集。

如果换个需求:管理方想做一个“招牌必点榜”,只列两家都有的甜品,那么只有芋圆和姜撞奶上榜。这个“两家共有”的动作,就是交集。并集记作 A∪B,表示“在 A 里或在 B 里”的元素;交集记作 A∩B,表示“既在 A 里又在 B 里”的元素。用数学语言写出来:

合并菜单时,如果不小心把两家都有的菜各数了一次,就会数多。要得到正确的总菜数,需要把重复数过的交集减掉,这就是容斥原理:总菜数 = 阿城的菜数 + 阿雨的菜数 − 两家共同的菜数。

现在你应该明白了:并集不是“把两个列表简单拼起来”,而是“合并且去重”;交集则是“找共同点”。这个直觉在做数据库查询、统计用户重合度时非常有用——凡是遇到“两个集合求整体”或“求重叠”,你脑子里就可以浮现阿城和阿雨的两张菜单。

A∪B={x∣x∈A∨x∈B}\displaystyle A \cup B = \{x \mid x \in A \lor x \in B\}
A∩B={x∣x∈A∧x∈B}\displaystyle A \cap B = \{x \mid x \in A \land x \in B\}
∣A∪B∣=∣A∣+∣B∣−∣A∩B∣\displaystyle |A \cup B| = |A| + |B| - |A \cap B|
第一个公式说并集是由“属于 A 或属于 B”的元素组成的;第二个说交集由“同时属于 A 和 B”的元素组成。第三个公式提醒我们:合并计数时,交集被重复计算了一次,必须减掉。
  1. “或”的逻辑甜品只要在 A 或 B 任意一张菜单上出现,就进入并集
    x∈A∨x∈B\displaystyle x \in A \lor x \in B
  2. “且”的逻辑甜品必须同时出现在两张菜单上,才进入交集
    x∈A∧x∈B\displaystyle x \in A \land x \in B
  3. 去重计数|A| 加上 |B| 时,两家的共同菜被加了两次,所以减去 |A∩B|
    ∣A∪B∣=∣A∣+∣B∣−∣A∩B∣\displaystyle |A \cup B| = |A| + |B| - |A \cap B|

差集与补集

阿城想推一个“阿城独家”系列,只卖自己菜单上有、阿雨菜单上没有的甜品。他从自己的 4 道菜里划掉两家共有的芋圆和姜撞奶,剩下双皮奶和杨枝甘露。这个“从 A 中拿掉 B 里也有的部分”的动作叫作差集,记作 A − B。

另一种玩法是找补集。夜市管理方有一份“全场甜品目录”U,包含夜市所有摊位可能卖的全部 100 道甜品。阿城的菜单只是 U 的子集,那么“在 U 中但不在阿城菜单上的甜品”就是阿城菜单的补集,记作 Ā。注意,补集必须有一个明确的“全集”U 才有意义——如果你只说“不在阿城菜单上的甜品”,却不说是哪个夜市的目录,这个补集就无法确定。

感觉一下这个差别:差集是“我有什么而你没有”,补集是“全场有什么而我没有”。在数据库里,差集对应“排除”操作,补集则对应“在全集范围内取反”。阿城靠差集找到了自己的独家菜,靠补集发现了还能拓展的新品——这就像算法里既要找差异,也要看清全局。

A∖B={x∣x∈A∧x∉B}\displaystyle A \setminus B = \{x \mid x \in A \land x \notin B\}
A‾={x∣x∈U∧x∉A}\displaystyle \overline{A} = \{x \mid x \in U \land x \notin A\}
第一个公式是差集的定义:属于 A 且不属于 B。第二个是补集的定义:属于全集 U 且不属于 A。它们的区别在于:差集只在 A、B 两个集合之间操作,补集则需要一个更大的全集作为参照系。
  1. 双条件筛选元素要在 A 里,同时不在 B 里
    x∈A∧x∉B\displaystyle x \in A \land x \notin B
  2. 差集成形收集所有这样的元素构成 A − B
    A∖B={x∣x∈A∧x∉B}\displaystyle A \setminus B = \{x \mid x \in A \land x \notin B\}
  3. 全集框架补集是在 U 的范围内挑出所有不在 A 中的元素
    A‾={x∣x∈U∧x∉A}\displaystyle \overline{A} = \{x \mid x \in U \land x \notin A\}

对称差运算

阿城和阿雨决定搞一个“独家拼盘”:只放一方独有的甜品,两家都有的不放。阿城的独有是双皮奶、杨枝甘露,阿雨的独有是芝麻糊、蛋挞,拼盘里就是这四道。这种“把两边的差集合并起来”的运算叫作对称差,记作 A△B。

对称差还有一个等价的定义:先求并集,再减去交集。直观上看,“恰好属于其中一方”的元素,就是“属于并集但不属于交集”的元素。这两种说法从不同角度描述了同一件事——一个是“各自独有再合并”,另一个是“合并之后删掉重叠”。

对称差在编程世界里有一个非常熟悉的亲戚——位运算里的“异或”XOR。两个开关状态不同时结果为 1,相同时为 0,和“恰好属于一方”的判定逻辑一模一样。你在 LeetCode 上看到的“找出只出现一次的数字”,本质就是利用对称差的性质,把成对出现的元素全部抵消掉。

A△B=(A∖B)∪(B∖A)\displaystyle A \triangle B = (A \setminus B) \cup (B \setminus A)
A△B=(A∪B)∖(A∩B)\displaystyle A \triangle B = (A \cup B) \setminus (A \cap B)
第一个公式把对称差看成“两个差集的并”;第二个公式把它看成“并集减去交集”。两个公式完全等价,前者偏重构造,后者偏重整体删减。
  1. 两边独有分别取出先求 A 有 B 没有的部分,再求 B 有 A 没有的部分
    (A∖B)∪(B∖A)\displaystyle (A \setminus B) \cup (B \setminus A)
  2. 整体删除重叠先合并两家的全部菜,再删除两家共同的菜
    (A∪B)∖(A∩B)\displaystyle (A \cup B) \setminus (A \cap B)

运算律与德摩根

阿城把菜单按价格从低到高排列,阿雨按口味从甜到淡排列,但合并后的总菜单内容不会变;先和隔壁奶茶摊谈联名,再和水果摊谈拼盘,跟先后顺序也无关。集合运算同样遵守这些“怎么换顺序都不变”的定律:交换律、结合律、分配律。比如 A∪B 永远等于 B∪A,A∩(B∪C) 可以展开成 (A∩B)∪(A∩C)。

最漂亮的是德摩根律,它像一面“镜子”,把并集的补集变成补集的交集。想象夜市贴出公告:“今晚双皮奶和芋圆都不卖”,这句话等价于“甜品节排除了双皮奶,也排除了芋圆”。把“都不卖”看成对整个菜单做补集操作,就能推出:

德摩根律还有一位伴侣叫“对偶原理”:把 ∪ 换成 ∩、∅ 换成 U,任何集合恒等式依然成立。这两个定律在程序员的布尔逻辑里天天出现:not (a or b) == (not a) and (not b) 就是第一律的翻版。学会德摩根律,你就能像摊主打通人脉一样,在补集和并交之间自由切换视角。

A∪B‾=A‾∩B‾\displaystyle \overline{A \cup B} = \overline{A} \cap \overline{B}
A∩B‾=A‾∪B‾\displaystyle \overline{A \cap B} = \overline{A} \cup \overline{B}
德摩根律揭示了补集与并、交运算之间的转换关系:补运算会把“并”变成“交”,把“交”变成“并”。它就像一面逻辑镜子,照出两个等价的世界。
  1. 第一律并的补转成交的补:不在“A 或 B”里的元素,等价于既不在 A 又不在 B
    A∪B‾=A‾∩B‾\displaystyle \overline{A \cup B} = \overline{A} \cap \overline{B}
  2. 第二律交的补转成并的补:不在“A 且 B”里的元素,等价于不在 A 或不在 B
    A∩B‾=A‾∪B‾\displaystyle \overline{A \cap B} = \overline{A} \cup \overline{B}

幂集与笛卡尔积

阿城想给甜品加配料:芋圆可选“加红豆”或“不加”。如果他有 3 道甜品,每道都有“加”和“不加”两种选择,那么“配料方案的所有可能组合”就有 2×2×2 = 8 种。这种“由 A 的所有子集组成的集合”叫作幂集,记作 P(A)。空集和 A 自己都算子集——好比“一道甜品都不加配料”和“所有甜品都加配料”也是两种合理的方案。

笛卡尔积则完全不同。阿城想设计“甜品 + 饮品”套餐:甜品有 3 种,饮品有 4 种,两两配对就能得到 12 种套餐组合。这种“把 A 中每个元素与 B 中每个元素配成有序对”的操作,记作 A×B。注意,配对是有顺序的:(双皮奶,柠檬茶) 和 (柠檬茶,双皮奶) 是两个不同的套餐!

幂集和笛卡尔积像两种扩展菜单的方式:幂集研究“同一批食材能做出多少种组合”,笛卡尔积研究“两类食材能配出多少种套餐”。排列组合、概率统计、数据库连接查询的底层逻辑,都藏在这两个看似简单的定义里。

∣P(A)∣=2∣A∣\displaystyle |P(A)| = 2^{|A|}
A×B={(a,b)∣a∈A,b∈B}\displaystyle A \times B = \{(a, b) \mid a \in A, b \in B\}
第一个公式说明幂集的大小是 2 的 n 次方——每个元素都有“选/不选”两种状态,n 个元素就有 2^n 种子集。第二个公式定义笛卡尔积:所有由 a 和 b 组成的有序对的集合。
  1. 每个元素二选一A 中每个元素在子集中要么被选入、要么被排除
    2×2×⋯×2=2∣A∣\displaystyle 2 \times 2 \times \cdots \times 2 = 2^{|A|}
  2. 幂集收集所有子集P(A) 是 A 的所有子集组成的集合
    P(A)={X∣X⊆A}\displaystyle P(A) = \{X \mid X \subseteq A\}
  3. 有序对配对A 中每个 a 与 B 中每个 b 组成一个有序对
    A×B={(a,b)∣a∈A,b∈B}\displaystyle A \times B = \{(a, b) \mid a \in A, b \in B\}

编程中的集合

阿城把纸质菜单录入了平板电脑,程序里的集合数据结构就是“电子菜单”。Python 中可以用 set 直接创建集合,系统会自动去重:{'双皮奶', '芋圆', '姜撞奶', '芋圆'} 存进去,自动变成 3 个元素。底层靠哈希表实现,查找一个元素平均只需 O(1) 时间——这就好比菜单按名字的拼音首字母自动建了索引,翻一下就找到了。

如果集合很小,还能用位运算来模拟。把每个元素对应二进制的一位,1 表示“菜单上有”,0 表示“没有”。那么并集就是按位或,交集就是按位与,差集就是 A 的位串与 B 取反后的位串做按位与。对称差则对应按位异或:

电子菜单让甜品摊的效率提升了一个量级:哈希表让“查一道菜”几乎不花时间,位运算让“合并两张菜单”变成一条指令。在实际工程中,当你需要频繁判断“用户是否属于多个群体”“标签是否重叠”时,集合数据结构往往比手写循环快得多,也简洁得多。

u=a∨b,t=a∧b,d=a∧¬b\displaystyle u = a \lor b, \qquad t = a \land b, \qquad d = a \land \lnot b
这里的 a、b 是二进制位串,每个位代表一个元素是否存在。或(OR) 做并集,与(AND) 做交集,与上取反做差集。位运算的妙处在于:一条 CPU 指令就能同时处理 64 个元素的集合运算。
  1. 按位或得并集两个位串逐位相或,任一位为 1 结果就是 1
    u=a∨b\displaystyle u = a \lor b
  2. 按位与得交集两个位串逐位相与,只有同为 1 才得 1
    t=a∧b\displaystyle t = a \land b
  3. 取反后与得差集先把 b 取反,再与 a 做按位与,留下 a 有而 b 没有的位
    d=a∧¬b\displaystyle d = a \land \lnot b

典型应用场景

夜市的中央数据库每天记录各摊位的销售流水。管理方想查“哪些甜品是阿城和阿雨至少一个摊位卖过的”,一条 SQL:SELECT 甜品 FROM 阿城 UNION SELECT 甜品 FROM 阿雨——这行命令底层就是并集运算。想查“两家都卖过”用 INTERSECT,想查“阿城卖过但阿雨没卖过”用 EXCEPT。数据库的关系代数,本质就是集合运算在二维表上的延伸。

算法设计里集合思想也无处不在。搜索引擎抓取网页后要对 URL 去重,本质是维护一个集合,新来的 URL 若已在集合中就不再处理;推荐系统计算“看过这部电影的人还喜欢什么”,需要求用户标签集合的交集和差集;A/B 测试分析两组用户的转化差异,用差集找出“只在实验组出现”的行为模式。这些都是本章讲过的运算在真实世界的投影。

从两张甜品菜单到数据库千万行记录,集合运算始终是那把“逻辑手术刀”。它告诉我们:所谓复杂问题,不过是几个基本集合操作以正确顺序组合的结果。阿城和阿雨靠它搞定了甜品节,数据工程师靠它处理了海量查询——这就是离散数学作为计算机基石的魅力。

R∪S,R∩S,R−S\displaystyle R \cup S, \qquad R \cap S, \qquad R - S
数据库表可以看作元组元素的集合,关系运算符 UNION、INTERSECT、EXCEPT 分别对应该并集、交集和差集。理解集合运算,就能从数学层面理解 SQL 的行为。
  1. 表即集合数据库的每个表是一组元组(行)的集合
    R={r1,r2,…,rn}\displaystyle R = \{r_1, r_2, \dots, r_n\}
  2. 查询即运算UNION 对应 R∪S,INTERSECT 对应 R∩S,EXCEPT 对应 R−S
    R∪S,  R∩S,  R−S\displaystyle R \cup S, \; R \cap S, \; R - S

AI 应用场景

用户画像标签的并集聚合

阶段:特征工程

解决的问题:推荐系统需要为每个用户维护兴趣标签,但同一个用户可能同时命中“甜品爱好者”和“芋圆爱好者”两个标签集合。传统做法是拼接列表,容易产生重复标签,导致统计失真。用并集运算可把多个标签源自动去重合并,得到干净的用户画像标签集合。

具体案例:某电商平台从搜索行为、购买记录、收藏夹三个渠道收集用户兴趣标签,三个数据表中同一用户的标签分别有数千行。数据工程师用 Spark 的 union 对三个标签表做并集,再用 subtract(差集)剔除负面标签词,最终每个用户得到一份无重复的标签集合,训练出的召回模型 CTR 提升 12%。

数据库人群筛选的差集与交集

阶段:数据分析

解决的问题:营销活动中需要圈定“高价值但未转化”的目标人群,仅靠 SQL 的 WHERE 条件难以处理跨表的人群关系。集合运算中的差集和交集可直接转换成 SQL 的 EXCEPT 和 INTERSECT,让复杂人群筛选逻辑清晰且高效。

具体案例:某金融产品的 AI 运营团队需要找出“近 30 天活跃且资产超 5 万,但未购买过该产品”的用户。工程师用两个子查询分别取出“活跃高资产用户”和“已购用户”,再用 EXCEPT 求差集,一条 SQL 就完成了过去需要多层嵌套子查询才能做到的任务,查询耗时从 4 秒降到 0.6 秒。

软件工程中的位掩码权限管理

阶段:后端开发

解决的问题:在 AI 平台中,不同用户对模型、数据集、算力资源拥有不同的读写权限。用多个布尔字段管理权限会冗余且易错,用位掩码将权限编码为整数,每个权限对应一个二进制位,通过位运算即可快速完成权限组合与校验。

具体案例:某 AI 中台系统用 4 位整数表示权限:读=1、写=2、执行=4、管理=8。用户权限 7(0111)表示读写执行四项中的三项。校验“是否有写权限”只需 permission & 2;给用户加一个“执行权限”只需 permission | 4;回收“写权限”则是 permission & ~2。这套位集合法让权限校验从数据库查询变成一次 O(1) 的整数运算。

Python 演示

python27 行
# 集合运算演示:两张甜品菜单的运算分析def main():    a = {"双皮奶", "杨枝甘露", "芋圆", "姜撞奶"}    b = {"芋圆", "姜撞奶", "芝麻糊", "蛋挞"}     print("A 菜单:", a)    print("B 菜单:", b)    print("并集 A|B:", a | b)    print("交集 A&B:", a & b)    print("差集 A-B:", a - b)    print("对称差 A^B:", a ^ b)    print("A 是否包含 B:", a >= b)     s = {1, 2, 3}    power = [[]]    for x in s:        power += [sub + [x] for sub in power]    print("幂集大小 2^n:", len(power))     mask_a = 0b1101    mask_b = 0b1011    print("位或(并):", mask_a | mask_b)    print("位与(交):", mask_a & mask_b)    print("位差(A&~B):", mask_a & ~mask_b) if __name__ == "__main__":    main()
目的:直观演示集合的并、交、差、对称差运算,以及幂集大小计算和位运算模拟集合的方法。
  1. a | b并集运算,等价于数学中的 ∪,自动去重。
  2. a & b交集运算,等价于数学中的 ∩。
  3. a - b差集运算,等价于数学中的 A − B。
  4. a ^ b对称差运算,等价于数学中的 A△B。
  5. power = [[]]幂集构造的起点,空集的幂集只含一个空子集。
  6. power += [sub + [x] for sub in power]每加入一个元素,就让已有的每个子集分别选择“包含它”或“不包含它”,数量翻倍。
  7. mask_a = 0b1101用 4 位二进制数表示集合中元素的存在情况,1 表示存在。
  8. mask_a & ~mask_bb 的位串取反后与 a 做按位与,得到属于 A 而不属于 B 的位。

常见误区

误区A∪B 不就是把 A 的元素和 B 的元素全部写在一条列表里吗?A={1,2,3},B={2,3,4},那 A∪B 就是 {1,2,3,2,3,4},一共 6 个元素。

正解集合是无重复元素的整体。并集的定义是“属于 A 或属于 B 的元素”,重复元素只保留一份,所以 A∪B={1,2,3,4},共 4 个元素。就像阿城和阿雨的菜单合并时,芋圆和姜撞奶不会写两遍。列表强调顺序和重复,集合强调唯一性,把两者混为一谈是最常见的起点错误。

为何常见:编程初学者接触的数组、列表允许重复元素,容易把“拼接列表”的经验迁移到集合运算上。

误区补集不就是差集吗?A 的补集就是从 U 里减去 A,和 A−B 没什么本质区别。

正解差集 A−B 只需要两个集合就能定义,它描述“在 A 中但不在 B 中”;补集 Ā 则必须依赖一个明确的全集 U,描述“在全场 U 中但不在 A 中”。没有 U 就没有补集。好比阿城的“独家菜”只需对比阿雨的菜单就能算出差集,但“夜市里阿城没卖的甜品”必须知道整个夜市的目录才能列出来。

为何常见:两者的符号都有“减去”的意象,初学者容易忽略补集对全集 U 的依赖,导致在集合运算中犯下逻辑错误。

误区不是(A∪B) 不就是 不是A 且 不是B 嘛?等等,到底是“且”还是“或”?我总记成 非(A∪B)=非A∪非B。

正解德摩根律的核心是“补集的交换”:非(A∪B)=非A∩非B,非(A∩B)=非A∪非B。用生活经验记:公告说“今天不卖甜汤也不卖咸粥”,等价于“今天所有汤品都不卖”——两个“不卖”合起来,而不是只排除其中一类。把“∪ 变 ∩、∩ 变 ∪”当成口诀,配合韦恩图画一遍就能牢牢记住。

为何常见:德摩根律涉及两个同时反转(补集与并交互换),大脑默认遵循“负负得正”的直觉,容易忽略运算符本身也要变化。

误区A 有 3 个元素,它的幂集不就该有 3×2=6 个子集吗?或者 3×3=9 个?

正解幂集大小是 2 的 n 次方。|A|=3 时 |P(A)|=8。因为每个元素在子集中有“选”和“不选”两种独立状态,3 个元素就是 2×2×2=8 种组合。而且空集和 A 本身都算子集,初学者经常漏数空集导致少算一个。阿城有 3 道甜品,每道甜品“加不加红豆”的组合方式就是 8 种。

为何常见:指数增长违背直觉,人们会习惯性地用乘法或倍数去估算,忽略了“每个元素二选一”的独立组合逻辑。

误区A×B 和 B×A 有什么不一样?乘法不是满足交换律吗,两个结果应该相同。

正解笛卡尔积的元素是有序对 (a,b),顺序不同则对象不同。A={双皮奶},B={柠檬茶} 时,A×B={(双皮奶,柠檬茶)},B×A={(柠檬茶,双皮奶)},两者代表不同的套餐。只有当 A 或 B 为空集时二者才都为空,或 A=B 时碰巧相同。记住笛卡尔积是“配对”不是“数量相乘”,配对中谁在前谁是后是有意义的。

为何常见:算术乘法的交换律根深蒂固,初学者容易把“个数相乘”的直觉延伸到“配对本身”。

面试题

Q1. 设 A={1,2,3},B={2,3,4},则 A∪B 是?

单选题 · easy

  • A.{1,2,3,4}← 正确答案
  • B.{2,3}
  • C.{1,4}
  • D.{1,2,3,2,3,4}

答案:A。并集合并 A 和 B 的所有元素并去重,重复的 2、3 只保留一份,最终是 {1,2,3,4}。选项 D 保留了重复元素,说明把集合当成列表处理了;B 是交集的结果;C 是各自独有的元素凑在一起,都不是并集定义。

Q2. 设 A={1,2,3},B={2,3,4},则 A∩B 是?

单选题 · easy

  • A.{1,4}
  • B.{2,3}← 正确答案
  • C.{1,2,3,4}
  • D.∅

答案:B。交集取两个集合共有的元素,只有 2 和 3 同时出现在 A 和 B 中,所以答案是 {2,3}。选 A 的同学把交集理解成了差集,选 C 则把它理解成了并集。就像两家甜品摊都卖的招牌菜只有芋圆和姜撞奶。

Q3. 关于空集,下列说法正确的有?

多选题 · easy

  • A.∅ 是任意集合的子集← 正确答案
  • B.∅ ∈ ∅
  • C.|∅| = 0← 正确答案
  • D.|{∅}| = 1← 正确答案

答案:ACD。空集是任何集合的子集,所以 A 正确;但空集不包含任何元素,所以“∅ 是 ∅ 的元素”为假,B 错误;空集的基数是 0,C 正确;{∅} 是含有一个元素(即空集)的集合,基数 1,D 正确。空集就像一张空菜单,但把空菜单装进盒子后,盒子本身占一个元素的位置。

Q4. 设全集 U={1,2,3,4,5},A={1,2},B={2,3},则 A∪B 的补集是?

单选题 · mid

  • A.{4,5}← 正确答案
  • B.{1,3,4,5}
  • C.{2,4,5}
  • D.{1,2,3}

答案:A。先求 A∪B={1,2,3},再在全集 U 中取补集,得到 {4,5}。也可以用德摩根律:A 的补集 {3,4,5} 与 B 的补集 {1,4,5} 取交集,结果同样是 {4,5}。这就像夜市总目录里去掉两家合并菜单上的甜品,剩下的是谁都没卖的。

Q5. 下列集合运算中,哪些满足交换律?

多选题 · mid

  • A.并集 A∪B← 正确答案
  • B.笛卡尔积 A×B
  • C.交集 A∩B← 正确答案
  • D.对称差 A△B← 正确答案

答案:ACD。并集“合并去重”和交集“找共同”都不依赖顺序,A、C 正确;对称差是“恰好一方独有”,交换两边当然不影响结果,D 正确;笛卡尔积的结果是有序对,(a,b)≠(b,a),所以 A×B≠B×A,B 错误。好比“双皮奶配柠檬茶”和“柠檬茶配双皮奶”是两个不同套餐。

Q6. 设 A={1,2,3},B={3,4,5},则 A−B 是?

单选题 · mid

  • A.{3}
  • B.{1,2}← 正确答案
  • C.{4,5}
  • D.{1,2,3,4,5}

答案:B。差集 A−B 取“在 A 中但不在 B 中”的元素,3 在 B 里所以被排除,剩下 {1,2}。选 C 的同学算的是 B−A,选 A 的同学算的是交集,选 D 则混淆成并集。就像阿城的独家菜是阿雨菜单上没有的那几道。

Q7. 对称差 A△B 可以等价表示为?

多选题 · mid

  • A.(A−B)∪(B−A)← 正确答案
  • B.(A∪B)−(A∩B)← 正确答案
  • C.(A∩B)∪(A−B)
  • D.(A∪B)∩(A∩B)

答案:AB。对称差的标准定义就是“两个差集的并”,A 正确;先求并集再删去交集,与“恰好属于一方”等价,B 正确。C 展开后等于 A,D 展开后等于 A∩B,都不符合对称差的语义。记住“独家拼盘”的比喻:要么你的菜、要么我的菜,重叠的不放。

Q8. 设集合 A 有 5 个元素,则 A 的幂集有多少个元素?

单选题 · hard

  • A.16
  • B.32← 正确答案
  • C.10
  • D.25

答案:B。幂集大小是 2 的 |A| 次方,2^5=32。每个元素在子集里有“选”和“不选”两种独立状态,5 个元素就是 2×2×2×2×2。选 C 的同学可能按组合数 C(5,1)+C(5,2) 等去算却漏了空集和全集,选 D 则误认为是乘法 5×5。

Q9. 设 |A|=3,|B|=4,则 |A×B| 等于?

单选题 · hard

  • A.7
  • B.12← 正确答案
  • C.34
  • D.6

答案:B。笛卡尔积的大小是两个集合基数的乘积,3×4=12。A 中每个元素都要和 B 中 4 个元素各配一次,得到 3×4=12 个有序对。选 A 的同学把笛卡尔积当成了并集计数,选 D 则可能是求了两个集合的某种组合数。就像 3 种甜品和 4 种饮品两两配出 12 个套餐。

Q10. 关于位运算与集合运算的对应关系,下列说法正确的有?

多选题 · extreme

  • A.按位或对应并集运算← 正确答案
  • B.按位与对应交集运算← 正确答案
  • C.按位异或对应对称差运算← 正确答案
  • D.按位取反可以直接得到任何集合的补集

答案:ABC。位串中每一位代表一个元素,或运算把两个集合的位合并,对应并集;与运算只保留两边都为 1 的位,对应交集;异或保留恰好一边为 1 的位,对应对称差,A、B、C 都正确。D 错误:按位取反会把所有 64 位全部翻转,必须先用掩码限定位宽才能得到全集 U 范围内的补集,否则结果包含集合外的无效位。