长度为 n 的 k-ary 项链是长度为 n 的有序列表,其项目来自长度为 k 的字母表,它是所有列表中共享旋转排序的排序中的字典第一个列表。
示例:(1 2 3) 和 (1 3 2) 是字母表 {1 2 3} 中长度为 3 的项链。
更多信息: http://en.wikipedia.org/wiki/Necklace_(combinatorics)
我想在 Scheme(或您选择的 Lisp)中生成这些。我找到了一些论文...
Savage - A New Algorithm for Generate Necklaces
Sawada - 在恒定摊销时间内生成手链
Sawada - 生成带有禁止子串的项链
...但是其中提供的代码对我来说是不透明的。主要是因为它们似乎没有传递所需的字母或长度(n)。我正在寻找的方案程序的形式是 (necklaces n '(ab c...))。
我可以通过首先生成 k^n 列表然后过滤掉旋转来轻松生成这些。但它的内存效率非常低......
谢谢!