计算集合中元素的个数

集合元素的个数,叫「势」,英文名叫「Cardinality」。集合 A 的「势」记做 |A| 或 card(A).

实例

我们可以从网站的「用户登录表」中查到任意时间段中登录的用户集。如果不借用数据库支持的集合操作,我们能查到如下数据:

(这里假定四、五、六月登录的用户集合分别是:A, B, C)

问题

因业务需要,需求出:

  1. 在四月份登录网站的用户中,有多少人也在五月也登录了?
  2. 有多少人每月都登录了网站?
  3. 五月中新登录的用户中,有多少人在六月也登录了?

分析

1. 在四月份登录网站的用户中,有多少人也在五月也登录了?

这其实是求四月和五月用户集合的交集的元素个数:card(A∩B)

计算如下:card(A∩B) = card(A)+card(B) - card(A∪B)

2. 有多少人每月都登录了网站?

每月都登录网站的话,这类人相当于 A, B, C 三个集合的交集:A∩B∩C

计算如下:card(A∩B∩C) = card(A)+card(B)+card(C)-card(A∪B)-card(B∪C)-card(C∪A)+card(A∪B∪C)

3. 五月中新登录的用户中,有多少人在六月也登录了?

五月新登录的用户即五月登录了但四月没有登录的用户:B - A

这部分在六月份也登录的集合是:(B - A)∪C = card(B) - card(A) - card(B∪C) + card(C∪A)

其他

Oracle 是支持集合运算的(参《查询集的集合操作》),可以不用上面的计算。但也有不支持集合运算符的数据库,就必须用到上面的计算了。

数学依据:集合论「排容原理(Inclusion–exclusion_principle)」

参: