如果您的问题符合以下假设,那么您实施的解决方案最好.
>对于每个有效字符,随机选择下一个字符串的最右边的字符,概率相等
>序列的开始总是不一样(它是随机的).
原因:
当我第一次阅读你的问题时,我提出了以下树:(为了简单起见,将你的问题缩减为长度为3个字符的字符串,并且只有2个可能的字符A和B)注意,根节点的最左边的子节点(在这种情况下是AAA)是总是与根节点(AAA)相同,因此我没有进一步构建该分支.
AAA
/ \
AAB
/ \
ABA ABB
/ \ / \
BAA BAB BBA BBB
在这个树中,每个节点都有下一个可能的序列作为子节点.要改进缓存,您需要使用广度优先遍历来遍历此树,并以相同的顺序将其存储在数组中.对于上面的树,我们得到以下字符串索引组合.
> AAA 0
> AAB 1
> ABA 2
> ABB 3
> BAA 4
> BAB 5
> BBA 6
> BBB 7
假设值(A)= 0且值(B)= 1,则可以将索引计算为
index = 2^0 * (value(string[2])) + 2^1 * (value(string[1])) + 2^2 * (value(string[0]))
这与您使用的解决方案相同.
我已经编写了一个python脚本来检查其他组合(比如长度为4个字符的字符串,其中A B C为可能的字符). Script link
因此,除非在开始时做出的两个假设是错误的,否则您的解决方案已经处理了缓存优化.