【问题标题】:how to use itertools.combinations on a bitset (python)如何在位集上使用 itertools.combinations (python)
【发布时间】: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。省略了刚刚在评论中描述的转换代码。
  • 所以要明确一点,您是否试图避免从bitsetbitset_set 的转换,这是一个set 对象?
  • 是的; bitset 到 bitset_set 并通过调用 sumcombinations 的结果转换回 bitset
  • 无法直接使用itertools.combinations 进行位操作。您可以修改组合代码(或编写自己的递归版本)以增量计算位和,从而将总时间复杂度降低到仅是组合总数的恒定倍数。

标签: python combinations bitset


【解决方案1】:

您可以让 Python 的 C 代码来完成,而不是自己在生成器中使用 Python 代码处理每个组合:

def combos(bitset, k):
    # for ith bit in bitset, if bit_i == 1, add 2**i to bitset_set
    return map(sum, combinations(bitset_set, k))

【讨论】:

  • 啊,仍然无法避免将我的位集转换为实际集(反之亦然)?
  • @Peabrain 它不需要是一个集合,但确实需要一些可迭代的。无论如何,你为什么要关心这个?
  • 我的算法使用了大量的二进制运算来加速我的算法。这是我似乎无法找到按位运算算法来获得所需结果的一部分。
  • @Peabrain 我相当怀疑从 bitset 到 bitset_set 的转换是什么让它变慢了。
  • 我同意@KellyBundy。 @Peabrain 我认为如果您必须使用 itertools.combinations 并遍历所有结果,则运行时将由 O(n^min(k, n - k)) 组合而不是位集转换主导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2015-01-24
  • 1970-01-01
相关资源
最近更新 更多