【问题标题】:Generating permutations using Bitmasking使用位掩码生成排列
【发布时间】:2015-01-20 09:11:58
【问题描述】:

我在网上回答了一些编程问题,这个问题让我很感兴趣。问题定义如下:

此代码按字典顺序打印字符串的所有排列。它有问题。通过修改或添加一行来查找并修复它!

输入:

输入由一行组成,其中包含一串小写字符,中间没有空格。它的长度最多为 7 个字符,并且它的字符按字典顺序排序。

输出:

字符串的所有排列在每一行打印一个,按字典顺序列出。

def permutations():
global running
global characters
global bitmask
if len(running) == len(characters):
    print(''.join(running))
else:
    for i in xrange(len(characters)):
        if ((bitmask>>i)&1) == 0:
            bitmask |= 1<<i
            running.append(characters[i])
            permutations()
            running.pop()

raw = raw_input()
characters = list(raw)
running = []
bitmask = 0
permutations()

有人可以为我回答并解释它是如何工作的吗?我对位掩码的应用并不熟悉。谢谢。

【问题讨论】:

    标签: python algorithm permutation bitmask lexicographic


    【解决方案1】:

    您应该通过添加以下行再次使位掩码位 0:

    bitmask ^= 1<<i
    

    代码:

    def permutations():
        global running
        global characters
        global bitmask
        if len(running) == len(characters):
            print(''.join(running))
        else:
            for i in xrange(len(characters)):
                if ((bitmask>>i)&1) == 0:
                    bitmask |= 1<<i
                    running.append(characters[i])
                    permutations()
                    bitmask ^= 1<<i  #make the bit zero again.
                    running.pop()
    
    raw = raw_input()
    characters = list(raw)
    running = []
    bitmask = 0
    permutations()
    

    说明:
    位掩码是一个整数,被视为一串位。在您的情况下,此字符串的长度等于输入字符串的长度。

    这个字符串中的每个位置都表示相应的字符是否已经添加到部分构建的字符串中。

    代码的工作原理是从一个空字符串开始构建一个新字符串。每当添加任何字符时,位掩码都会记录它。然后将字符串发送到更深的递归中以进一步添加字符。当代码从递归返回时,将删除添加的字符并且必须将位掩码值设为其原始值

    更多关于屏蔽的信息可以在这里找到。http://en.wikipedia.org/wiki/Mask_%28computing%29

    编辑:
    假设输入字符串是“abcde”,并且在代码执行的任何时候的位掩码都是“00100”。这意味着到目前为止,仅将字符“c”添加到部分构建的字符串中。 因此,我们不应再添加字符“c”。
    "if" 条件((bitmask &gt;&gt; i) &amp; 1) == 0 检查位掩码中的第 i 个位是否已设置,即字符串中是否已添加第 i 个字符。如果未添加,则仅添加该字符,否则不添加。

    如果位操作对你来说是新的,那么我建议你在互联网上查找这个主题。

    【讨论】:

    • 感谢您的回复。但是,我仍然感到困惑。循环中的 if 语句的目的是跟踪必须添加的字符吗?
    • @kalev25 用示例添加说明。
    猜你喜欢
    • 2020-01-28
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2011-04-25
    相关资源
    最近更新 更多