使用Bitmasking生成排列

时间:2014-11-22 06:15:24

标签: python algorithm permutation bitmask lexicographic

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

  
    

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

  

输入:

输入由一行组成,其中包含一串小写字符,中间没有空格。它的长度最多为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()

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

1 个答案:

答案 0 :(得分:2)

您应该通过添加以下行来重新设置位掩码位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

编辑:
假设输入字符串是&#34; abcde&#34;并且代码执行中任何一点的位掩码都是&#34; 00100&#34;。这意味着只有角色'c&#39;到目前为止已添加到部分构建的字符串。 因此,我们不应该添加字符&#39; c&#39;再次,
&#34;如果&#34;条件((bitmask >> i) & 1) == 0检查是否已设置位掩码中的第i位,即是否已在字符串中添加了第i个字符。如果未添加,则仅附加字符,否则不附加。

如果位操作对您而言是新的,那么我建议您在互联网上查看此主题。