【发布时间】:2021-11-26 02:34:21
【问题描述】:
我有一个代表位集的 python 整数。如何使用 itertools.combinations(或其他方法)将整数/位集作为输入并生成大小为 k 的所有组合,而无需将我的位集转换为集作为 itertools.combinations 的输入。强>
例如:
combos(01011, 2) -> {01010, 01001, 00011}
我目前的代码:
def combos(bitset, k):
# for ith bit in bitset, if bit_i == 1, add 2**i to bitset_set
for s in combinations(bitset_set, k):
yield sum(s)
我的代码很耗时,我必须将我的 bitset 转换为实际的 set,执行组合,然后将这些 set 相加以取回我的 bitset。我正在努力减少这段时间。
【问题讨论】:
-
你的 bitset 真的是 python int 吗? int 是不可迭代的,那么你如何调用
itertools.combinations呢? -
@rchome 他们不是。他们正在使用
bitset_set。省略了刚刚在评论中描述的转换代码。 -
所以要明确一点,您是否试图避免从
bitset到bitset_set的转换,这是一个set对象? -
是的; bitset 到 bitset_set 并通过调用
sum将combinations的结果转换回 bitset -
无法直接使用
itertools.combinations进行位操作。您可以修改组合代码(或编写自己的递归版本)以增量计算位和,从而将总时间复杂度降低到仅是组合总数的恒定倍数。
标签: python combinations bitset