按:本文从Google Sites的旧站搬迁而来。
集合元素的个数,叫「势」,英文名叫「Cardinality」。集合 A 的「势」记做$\vert A \vert$或 card(A). 本文记录「排容原理(Inclusion–exclusion_principle)」的一个应用记录。
我们可以从网站的「用户登录表」中查到任意时间段中登录的用户集。如果不借用数据库支持的集合操作,我们能查到如下数据:
(这里假定四、五、六月登录的用户集合分别是:A, B, C)
用户集合 | 业务含义 |
---|---|
A | 四月份登录网站的用户集合A |
B | 五月份登录网站的用户集合B |
C | 六月份登录网站的用户集合C |
A∪B | 四、五月份登录网站的用户集合 |
B∪C | 五、六月份登录网站的用户集合 |
C∪A | 四、六月份登录网站的用户集合 |
A∪B∪C | 四、五、六月份登录网站的用户集合 |
因业务需要,需求出:
这其实是求四月和五月用户集合的交集的元素个数:$\vert A\cap B\vert$
计算如下: $\vert A\cap B\vert=\vert A \vert + \vert B \vert-\vert A \cup B \vert$
每月都登录网站的话,这类人相当于 A, B, C 三个集合的交集:A∩B∩C
计算如下:
$\vert A\cap B\cap C \vert = \vert A \vert + \vert B \vert + \vert C \vert - \vert A \cup B \vert - \vert B\cup C \vert - \vert C \cup A \vert + \vert A\cup B\cup C \vert$
五月新登录的用户即五月登录了但四月没有登录的用户:B - A
这部分在六月份也登录的集合是:
$(B - A) \cup C = \vert B \vert - \vert A \vert - \vert B \cup C \vert + \vert C \cup A \vert$
Oracle 是支持集合运算的(参《查询集的集合操作》),可以不用上面的计算。但也有不支持集合运算符的数据库,就必须用到上面的计算了。
参: