【问题标题】:Fastest way to generate bit permutations in Python 3.x在 Python 3.x 中生成位排列的最快方法
【发布时间】:2017-03-19 20:25:54
【问题描述】:

我需要生成所有可能的 N 选择 K N 位数字,其中设置了 K 位。 我能想到的最好和最简洁的选择非常慢:

def kbits(n, k):
    result = set()
    for bits in itertools.combinations(range(n), k):
        s = 0
        for bit in bits:
            s |= 1 << bit
        result.add(s)
    return result

kbits(25, 12) 在我的机器上花了 8.3 秒。

我怎样才能让它更快?例如,也许有一种方法可以批量设置所有位,而不需要遍历所有位?

【问题讨论】:

  • 你实际上想用这个结果来实现什么?您有什么性能要求?
  • 嗯,这是使用 DP 解决旅行商问题的一部分。我正在生成城市的所有 2**(n-1) 个子集,然后遍历它们。实际上,除了让它尽可能快之外,对我没有任何性能要求:)

标签: python algorithm python-3.x binary combinations


【解决方案1】:

您的kbits(25, 12) 正在计算相同的 25 次方中的 12 次,超过 500 万次,而它只需要计算一次(并且这样做后,可以使用 sum() 内置函数而不是构建结果零碎的)。

这是一个更短的解决方案,在我的机器上也快 3 倍:

def kbits(n, k):
    powers = [1 << e for e in range(n)]
    return {sum(bits) for bits in itertools.combinations(powers, k)}

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2012-06-27
    • 2010-11-21
    相关资源
    最近更新 更多