问题描述
我想有效地生成所有单词长度 N(N 是素数),不包括同构的。
词A同构到词B,如果有N元素转换词A 到词 B。
Let V - 是 K 个元素的字母表。
例如 V = {a,b}
设 N 为 7
那么,例如单词 A = {a,a,b,a} 与单词 B = {a,b} 和单词同构C= {a,a} 因为有限循环群 S= {0,1,2,3,4,5,6} 有自同构 {0,6,3} 和 {0,2}
最简单的算法是
- 找出所有可能的单词
- 找到具有 N 个元素(N 个素数)的有限循环群的所有自同构
- 排除同构词
不幸的是,这种方式在算法上效率不高。
解决方法
如果您反对需要存储所有唯一词的简单算法,那没有必要。对于 K^N 个单词中的每一个,测试它在字典序上是否小于或等于其所有同构(规范),如果是,则返回它。
我们可以做得更好
-
生成所有规范的 (N−1) 字母后缀并附加所有可能的第一个字母。
-
在测试规范性之前,通过遍历可能的字母的第二个位置并生成其他字母不小于第二个位置的后缀来生成 (N−1) 个字母后缀。
我们可以走得更远,但我怀疑增加的复杂性是否会带来回报。