纯numpy实现的非递归方法。
考虑到集合中每个元素在子集中有两种状态,分别为存在与不存在,因此总共有$2^n$种可能,每种可能$0,1,2, \dots, 2^n-1$都可以用二进制表示,例如$n=10$时(元素个数,也是二进制的宽度),二进制表示为0001100100
。因此获得对应关系,0表示元素不会出现在子集中,1表示出现在子集中。
利用这种对应关系,使用numpy的编程实现,
1 2 3 4 5 6 7 8 9 10 11
| import numpy as np
def list_all_sub_groups(es): n = len(es) for i in range(2 ** n): idx = (np.array(list(np.binary_repr(i, n))) == "1") yield es[idx]
es = np.array(["a", "b", "c", "e", "f"]) for e in list_all_sub_groups(es): print(e)
|
结果如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| [] ['f'] ['e'] ['e' 'f'] ['c'] ['c' 'f'] ['c' 'e'] ['c' 'e' 'f'] ['b'] ['b' 'f'] ['b' 'e'] ['b' 'e' 'f'] ['b' 'c'] ['b' 'c' 'f'] ['b' 'c' 'e'] ['b' 'c' 'e' 'f'] ['a'] ['a' 'f'] ['a' 'e'] ['a' 'e' 'f'] ['a' 'c'] ['a' 'c' 'f'] ['a' 'c' 'e'] ['a' 'c' 'e' 'f'] ['a' 'b'] ['a' 'b' 'f'] ['a' 'b' 'e'] ['a' 'b' 'e' 'f'] ['a' 'b' 'c'] ['a' 'b' 'c' 'f'] ['a' 'b' 'c' 'e'] ['a' 'b' 'c' 'e' 'f']
|
转载请包括本文地址:https://allenwind.github.io/blog/10997
更多文章请参考:https://allenwind.github.io/blog/archives/