我想遍历向量的所有不同排列。我已经尝试通过vecextract()
结合使用numtoperm()
来创建排列向量并vecsort(,,,8)
删除等效排列。
不幸的是,这不能很好地扩展:在我当前的 4GB 堆栈大小中,向量的最大大小小于 12!,而我的机器只有 16GB。
有没有办法在不耗尽内存的情况下做到这一点,也许是直接生成第k个不同的排列?
我想遍历向量的所有不同排列。我已经尝试通过vecextract()
结合使用numtoperm()
来创建排列向量并vecsort(,,,8)
删除等效排列。
不幸的是,这不能很好地扩展:在我当前的 4GB 堆栈大小中,向量的最大大小小于 12!,而我的机器只有 16GB。
有没有办法在不耗尽内存的情况下做到这一点,也许是直接生成第k个不同的排列?
PARI 中没有为此内置任何内容。我建议阅读如何生成多集的所有排列?.
使用forperm
.
forperm([1,1,2,3], v, print(v))
生产
Vecsmall([1, 1, 2, 3])
Vecsmall([1, 1, 3, 2])
Vecsmall([1, 2, 1, 3])
Vecsmall([1, 2, 3, 1])
Vecsmall([1, 3, 1, 2])
Vecsmall([1, 3, 2, 1])
Vecsmall([2, 1, 1, 3])
Vecsmall([2, 1, 3, 1])
Vecsmall([2, 3, 1, 1])
Vecsmall([3, 1, 1, 2])
Vecsmall([3, 1, 2, 1])
Vecsmall([3, 2, 1, 1])
请注意,forperm
应该对输入向量进行排序以获得正确的结果。