アルゴリズム

包除原理

二集合の場合

AB=A+BAB|A \cup B| = |A| + |B| - |A \cap B|

両方に属する要素を二度数えているため、共通部分を一度引く。

一般形

nn 個の集合では、空でない添字集合 SS ごとに共通部分を取り、S|S| が奇数なら加え、偶数なら引く。

i=1nAi=S{1,,n}(1)S+1iSAi\left|\bigcup_{i=1}^{n} A_i\right| = \sum_{\emptyset \ne S \subseteq \{1,\dots,n\}} (-1)^{|S|+1}\left|\bigcap_{i\in S} A_i\right|

部分集合を全探索する実装は O(2n)O(2^n) なので、nn が小さく共通部分を高速に評価できる場合に有効である。