设置递归函数以计算Python中的包含排除

时间:2014-01-30 18:17:36

标签: python recursion

对于那些不熟悉的人,包含 - 排除原则提出了一种方法来确定相交集合的值,而无需重复计算。简而言之,如果你有两个集合A,B并且它们相交,则可以通过将两个集合的值相加在一起然后减去它们的交集以避免重复计算来计算它们的并集的值。

换句话说,

 $/mu(A /union B) = /mu(A) + /mu(B) - /mu(A /intersection B)$.  

这可以扩展到任何有限数量的集合,甚至可以扩展到无限数量的集合。如何在Python中构造一个使用这个原理的递归函数?

2 个答案:

答案 0 :(得分:1)

只需使用套装。

AuB = set(A).union(B)
len(AuB)

如果你想要AnB,也可以使用set.intersection。

lenAuB = len(A) + len(B) - len(set(A).intersection(B))

(我假设A和B在最后一行没有重复的项目)

答案 1 :(得分:1)

通常,您不会使用PIE。如果你想要联盟的大小,那就拿联盟:

def union_size(sets):
    return len(set.union(*sets))

PIE在组合学中更有用,在组合学中你可能有一组2亿个元素,一组3亿个元素,以及一种方法来告诉他们的交集包含1亿个元素,而不是逐个遍历所有元素。但是,在编程中,您不使用对集合进行编码的紧凑表达式。你有5亿元素存在于记忆中。相交这些集合需要遍历2亿个元素中的每一个,并查看它是否在另一个集合中。 PIE没有任何优势。

无论如何要使用它,最简单的方法是使用itertools

import itertools
def union_size(sets):
    return sum((-1)**(i+1) * len(set.intersection(*subset))
               for i in xrange(1, len(sets) + 1)
               for subset in itertools.combinations(sets, i))