我希望得到的答案是:
我希望有人能告诉我解决这些类型问题的算法的一般类别。理想情况下,算法可以并行运行,但我仍然对只能按顺序执行的算法非常感兴趣。非常感谢具体的算法名称或参考文献:)
到目前为止我做了什么:
我基本上使用一些暴力方法来解决这个问题,包括生成给定字符串长度的所有排列,然后过滤掉与规则集不匹配的排列。我不喜欢这种方法,因为它显然很慢并且很快就受到我的计算能力(1台PC)和字符串大小的限制。我开始对这种方法进行很少的优化,但感觉我必须重新发明轮子,并且可能已经有一套算法来解决这些问题。
考虑如下字符串:
ABCDBEACBDECDBAACBE
我正在尝试找出有效的方法来生成符合一组规则/条件的字符串的所有排列。
根据上述规则,单个有效排列的一个例子是:
DE CDBEACBDECDBAACBE
因此,给定原始字符串,假设我们定义了以下范围:
[(0,4),(8,14)]
这看起来像是:
[ABCDB] EAC [BDECDBA] ACBE
有效的排列示例是:
BD CDBEACB AB CDBAACBE
范围:
[(0,4),(8,14)]
有效的排列示例是:
B AB DBEACB AB CDBAACBE
范围:
[(0,4),(3,7)]
这看起来像是:
[ABCD [B] EAC] BDECDBAACBE
有效的排列示例是:
ABC ADB ACBDECDBAACBE
答案 0 :(得分:1)
我建议您阅读deterministic finite automaton。
我试图模拟这类问题的方法是将问题转变为一个状态机,它能够根据一次一个字符来识别你想要的字符串。
拥有状态机之后,您可以使用动态编程来计算可以通过在特定状态下启动而生成的匹配字符串的数量。 (州知道到目前为止已经生成了多少个字符,以及每个规则的进度。)
使用此动态编程的结果,您可以在时间O(n)中生成匹配字符串的按字典顺序排列的第k个示例,其中n是字符串的长度。
但是,解决动态编程的成本会有很大差异,具体取决于规则集的复杂程度。
对于你的例子3:
There must be at least 2 differences from the original string
The differences must be in the alphabet set (A,B,C,D,E)
Differences must occur within defined index ranges of the string
Each range must have 2 differences
州政府需要包含以下信息:
Number of differences in first range (0,1,2)
Number of differences in second range (0,1,2)
因此总共有9个州要建模。
对于具有R范围的系统,每个系统都需要D差异,需要(D + 1)^ R个状态(如果范围不重叠则更少)。