如何排列30个字符的二进制字符串并省略“错误字符串”

尼古拉斯·奥多尼亚

我输入字符串的长度(10或30或...),然后输入“坏字符串”“ 101”,“ 111”,并计算不包含坏字符串的排列数。

我用itertools进行了尝试,它对于10-15的字符串效果很好,但是对于30的字符串,它的结果超过一万亿,并且无法高效运行。我认为该方法是一次构建一个字符的字符串,但是我不知道该怎么做的算法。

import itertools
v1="111"
v2="101"
def perms(n):
    for i in range(2**n):
        s=bin(i)[2:]
        s="0"*(n-len(s)) + s
        if v1 not in s and v2 not in s:
            print(s)
            yield s
print len(list(perms(10)))
2号环

这是另一个解决方案。在我的旧机器上,它的运行速度比Stefan的代码快。

我们使用str.format方法将数字转换为位串,从而对数字进行迭代当我们发现一个带有错误模式的位串时,我们会跳到第一个在该位位置不包含该模式的数字。因此,如果我们发现不良模式2**0在位串位位置(LSB)处结束,则前进1,如果不良模式2**1在位位置处结束,则前进2,依此类推

这是一个带有循环打印请求的版本,因此我们可以看到发生了什么。

def skip_bad(width, bad=("101", "111")):
    n = 0
    while n < 1<<width:
        s = '{0:0{1}b}'.format(n, width)
        for b in bad:
            i = s.find(b)
            if i != -1:
                i = width - i - len(b)
                print('skipping', s, i)
                n += 1 << i
                break
        else:
            yield s
            n += 1

for i in skip_bad(5):
    print(i)

输出

00000
00001
00010
00011
00100
skipping 00101 0
00110
skipping 00111 0
01000
01001
skipping 01010 1
01100
skipping 01101 0
skipping 01110 1
10000
10001
10010
10011
skipping 10100 2
11000
11001
skipping 11010 1
skipping 11100 2

这是我用来获取注释中给出的时序数据的版本。

def skip_bad(width, bad=("101", "111")):
    n = 0
    while n < 1<<width:
        s = '{0:0{1}b}'.format(n, width)
        for b in bad:
            i = s.find(b)
            if i != -1:
                n += 1 << (width - i - len(b))
                break
        else:
            yield s
            n += 1

width = 30
print(width)
print(sum(1 for _ in skip_bad(width)))

输出

30
2550409

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何生成一个26个字符的十六进制字符串,该字符串等于106位和((二进制为(53个1-53个零))

来自分类Dev

AND两个二进制字符串

来自分类Dev

如何计算 R 中的二进制字符串排列?

来自分类Dev

二进制到字符串/字符串到二进制

来自分类Dev

如何将一个字符串完整地转换为二进制?

来自分类Dev

创建随机二进制字符串:如何在插入另一个字符串之前从to_string()中删除空字符'\ 0'

来自分类Dev

如何将此二进制字符串转换为普通字符串?

来自分类Dev

如何将此二进制字符串转换为普通字符串?

来自分类Dev

如何将二进制字符串的文字字符串表示形式转换为二进制字符串?

来自分类Dev

二进制中的两个字符串的汉明距离不正确

来自分类Dev

将十六进制字符串转换为二进制字符串

来自分类Dev

十六进制值的常规字符串到二进制字符串

来自分类Dev

十六进制字符串到二进制字符串

来自分类Dev

将字符串转换为二进制?

来自分类Dev

二进制字符串余数3

来自分类Dev

字符串(二进制)到int in python?

来自分类Dev

Python中带字符串的二进制

来自分类Dev

将二进制转换为字符串

来自分类Dev

来自JavaScript二进制字符串的Blob

来自分类Dev

Python:从二进制转换为字符串

来自分类Dev

在字符串中翻转二进制

来自分类Dev

减少二进制字符串

来自分类Dev

二进制字符串到整数堆栈

来自分类Dev

对二进制字符串进行范围查询?

来自分类Dev

二进制代码转换为字符串

来自分类Dev

将字符串转换为二进制?

来自分类Dev

二进制字符串余数3

来自分类Dev

Java中二进制字符串的异或

来自分类Dev

字符串二进制运算

Related 相关文章

热门标签

归档