python - 在具有给定字母的所有可能的 4 字符字符串中查找 4 字符字符串索引的有效方法

标签 python string combinatorics cartesian-product

这个:

A = b'abcdefghijklmnopqrstuvwxyz0123456789!'
n = len(A)

def f(s):
    t = 0
    for i, c in enumerate(s):
        t += A.index(c) * n ** (3 - i)
    return t

print(f(b'aaaa'))  # first possible 4-char string, should be 0
print(f(b'aaab'))  # 2nd possible 4-char string, should be 1
print(f(b'!!!!'))  # last possible 4-char string, should be 37^4 - 1

可以在所有可能的由字母 A 组成的 4 字符字符串中查找 4 字符字符串的索引,但由于 A.index 太多,它似乎效率不高() 调用。

如何在所有可能的由字母 A 组成的 4 字符字符串中快速高效地查找 4 字符字符串的索引?

最佳答案

我的意思是,我能想到的唯一方法是使用愚蠢的无分支公式按原样计算索引,但我没有其他可以为您提供的。

A = b'abcdefghijklmnopqrstuvwxyz0123456789!'
n = len(A)

def f(s,A):
    t = 0
    for i, c in enumerate(s):
        t += A.index(c) * n ** (3 - i)
    return t

def g(s,A):
    t = 0
    for i, c in enumerate(s):
        t += (c - 97 + (c<97)*75 + (c<48)*25) * n ** (3 - i)
    return t


print(f(b'aaaa',A),g(b'aaaa',A))  # first possible 4-char string, should be 0
print(f(b'aaab',A),g(b'aaab',A))  # 2nd possible 4-char string, should be 1
print(f(b'!!!!',A),g(b'!!!!',A))  # last possible 4-char string, should be 37^4 - 1

import timeit
ft = timeit.timeit(lambda: 'f(b"aop!")',number=1000000)
gt = timeit.timeit(lambda: 'g(b"aop!")',number=1000000)
print(f'f: {ft}, g: {gt}, factor: {ft/gt}')

输出:

0 0
1 1
1874160 1874160
f: 0.12712620000820607, g: 0.06313459994271398, factor: 2.0135741752312635

编辑:我尝试了另一件事:

def h(s):
    arr = np.array(list(s))
    return sum( (arr - 97 + (arr<97)*75 + (arr<48)*25) * n ** (3 - np.array([0,1,2,3])) )

输出:

0 0 0
1 1 1
1874160 1874160 1874160
f: 0.10835059999953955, g: 0.07444929995108396, h: 0.06341919989790767,
factor f/g: 1.4553608975602195, factor f/h: 1.7084826073801391

关于python - 在具有给定字母的所有可能的 4 字符字符串中查找 4 字符字符串索引的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71266013/

相关文章:

algorithm - 限制星图之间的边数,使图是平面的

算法:如何找到 SAT 的解决方案数量?

python - 快速卡尔曼滤波器

python - 为什么 struct.pack 在性能上有如此高的可变性?

java - `+`在Java源代码中的Strings在哪里实现?

python - 专门使用正则表达式或语句进行字符串操作

algorithm - 最大化表的总和,其中每个数字必须来自唯一的行和列

python - 键入函数以根据属性区分类

javascript - 我如何在谷歌应用引擎上为 html5 创建一个 websocket

python - 如何使用python在字符串和整数之间添加空格