Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算功率集中的组数?_Python_Algorithm - Fatal编程技术网

Python 如何计算功率集中的组数?

Python 如何计算功率集中的组数?,python,algorithm,Python,Algorithm,给定一个整数列表,是否有算法计算功率集中的集合数?这不应该包括空集,例如,{1,2,3}与{2,3,1}相同,因此它们不应该被计数两次,即powerset 注意:列表中的元素不一定是唯一的。您可以使用itertools函数生成每个S子集,而无需重复 def powerset(iterable): result = set() for l in xrange(1, len(iterable) + 1): for subset in itertools.combina

给定一个整数列表,是否有算法计算功率集中的集合数?这不应该包括空集,例如,{1,2,3}与{2,3,1}相同,因此它们不应该被计数两次,即powerset

注意:列表中的元素不一定是唯一的。

您可以使用itertools函数生成每个S子集,而无需重复

def powerset(iterable):
    result = set()
    for l in xrange(1, len(iterable) + 1):
        for subset in itertools.combinations(iterable, l):
            result.add(subset)
    return sorted(result, key=len)

S = ['x', 'y' ,'z', 'y']
for subset in powerset(S):
    print subset
结果:

('z',)
('y',)
('x',)
('z', 'y')
('x', 'y')
('y', 'y')
('x', 'z')
('y', 'z')
('y', 'z', 'y')
('x', 'y', 'z')
('x', 'z', 'y')
('x', 'y', 'y')
('x', 'y', 'z', 'y')

集合定义为仅包含唯一/不同的元素。一个集合的动力集合中的集合数为集合中的2^个元素。电源集包含空的集合,因此您需要的是集合-1中的2^elements\u

因此,列表集合的功率集中的集合数是列表中的2^unique\u elements\u,没有空集合的集合数是列表中的2^unique\u elements\u-1

另一种方法是创建一个与唯一元素数相同大小的位数组。数组中的每一位都对应于该元素是否在该特定的powerset元素中。假设你的元素是9,7,4。以下是映射的外观:

powerset element | 9 | 7 | 4  
-----------------+---+---+---
[]               | 0 | 0 | 0 
[4]              | 0 | 0 | 1
[7]              | 0 | 1 | 0
[4, 7]           | 0 | 1 | 1 
[9]              | 1 | 0 | 0
[4, 9]           | 1 | 0 | 1
[7, 9]           | 1 | 1 | 0  
[4, 7, 9]        | 1 | 1 | 1    
所以你最终只能用二进制数了。你能用n个二进制数字造出多少个数字?2^n。有多少人不包括零?2^n-1

要实际生成powerset,下面是一些代码。注意:为了方便起见,它使用列表

def gen_powerset(l):
    if not l:
        yield []
        return
    for sub_powerset in gen_powerset(l[1:]):
        yield sub_powerset
        yield [l[0]] + sub_powerset
例如:

>>> list(gen_powerset(list(set([1, 4, 2, 2, 3]))))
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], 
 [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]]
>>> len(list(gen_powerset(list(set([1, 4, 2, 2, 3])))))
16
注意16是2^4,这是[1,4,2,2,3]中唯一元素的数量


但是,将2提高到一个功率要比仅仅为了计数而生成整个集合容易得多

重复项在功率集中的集合数量中不起作用-您可以简单地使用功率集公式-2n-1,如下所示,其中n是唯一元素的数量

动机-每个唯一元素可以被选择,也可以不被选择。我们选择哪个事件并不重要,因此每个唯一元素有2种可能性,因此总共2*2*…*2=2n种可能性。这里的-1用于排除空集

具有重复项的“集合”:

一个更有趣的问题是,如果我们假设每个“集合”可以包含重复项,但不会比输入中出现的次数多,则生成powerset

所以,对于像1,2,2,3这样的东西,一些需要计数的“集合”将是2,2,3,1,2,2,2,2,等等

让我们想想这个

对于1,2,2,3,我们可以选择1或不选择2种可能性,我们可以选择0-2 2的3种可能性,我们可以选择3或不选择2种可能性

请注意,每个不同元素的出现次数为+1

所以,伪代码:

setCount = 1
for each distinct element e
   setCount *= 1 + number of occurrences of e
output setCount-1

一组有一个电源组。电源集中的元素数为2**lens,其中s为起始集,或2**lensetl,表示可能包含重复项的列表。排除空集合leaves 2**lensetl-1.{1,2,2}不是集合,而是列表。列表{1,2,2}中的元素集是{1,2},因此@SteveJessop的答案是正确的。@Dukeling:不需要比我说的更复杂。lenset[1,2,2,3]是3。@Dukeling:你没有用我能识别的任何意义上的set这个词。1,2,2,3不是一个集合。当然,发问者也可能没有使用我所认识的任何含义的单词,这正是我评论而不是回答的原因:-虽然我的评论,发问者说[1,2,2]的输出应该是3,所以我认为他们可能是指计数集合。这是打印排列,即顺序问题。我希望它没有排序。只是修复了它:组合是正确的函数。但是现在我看到'x','y','z''x','z','y'这两个都是同一个集合…看起来可能是同一个子集,但实际上它使用了两个不同的'y'。除非使用集合,否则无法避免这种情况。请参阅我的代码2^-1,因为要排除空集。@AbhishekBansal:为什么要排除空集?这也是电源装置的一部分。Op希望这样。问题陈述中提到了它。@AbhishekBansal:oops阅读理解失败,谢谢。OP需要powerset中的集合数;集合不包含重复项,因此1,2,2,3不应该计算。@AaronDufour我仍然认为这可能是OP想要的-在我的答案中添加了一个注释,这样,无论哪种方式,我都可以回答这个问题。
setCount = 1
for each distinct element e
   setCount *= 1 + number of occurrences of e
output setCount-1