2012-08-15 244 views
0

我正在研究一些我正在研究的研究的java代码,并且需要有一种方法来迭代ArrayList的所有排列。我查看了以前在这里提出的一些问题,但大多数并不是我想要做的,而那些接近的问题有处理字符串和用Perl编写的示例代码的答案,或者在似乎是一个实现的情况下喜欢它会工作......实际上并不工作。遍历数组的排列

理想情况下,我正在寻找提示/代码片段来帮助我编写一个函数permute(list,i),当我从0到list.size()时!给我我的ArrayList的每个排列。

+0

n!变得非常快速。你的名单有多大? – GriffeyDog 2012-08-15 19:58:35

+0

当您谈论排列时,字符串中的字符与列表中的节点之间没有区别。 – 2012-08-15 20:00:31

+0

你是否尝试谷歌'所有排列'alforithm?这实际上你需要 – maks 2012-08-15 20:01:46

回答

2

有一种从0到(n! - 1)的计数方式,它将列出n个元素列表的所有排列。这个想法是在使用factorial number system时重写数字,并将数字解释为确定要使用哪种置换的编码方式。如果您对此感到好奇,我有a C++ implementation of this algorithm。我也一次gave a talk关于这个,以防你想要的话题的一些视觉效果。

希望这会有所帮助!

+0

我通过演示文稿浏览了它,它更容易实现完整阅读它的OP问题!也许你可以编辑你的答案,并给出一些关于演示文稿的小介绍,以及它如何帮助。看起来很有趣 – Cratylus 2012-08-15 20:07:21

+0

+1 - 这也是已知的作为'排列映射' - 谷歌应该导致替代实现 – dfb 2012-08-15 20:08:24

2

如果遍历所有排列对您来说已经足够,请参阅此答案:Stepping through all permutations one swap at a time。 对于给定的n,迭代器产生数字0(n-1)的所有排列。 您可以简单地将它包装到另一个迭代器中,该迭代器将数字的排列转换为数组元素的排列。 (请注意,您不能只用迭代器中的int[]替换任意数组/列表,该算法需要使用数字。)

+0

谢谢。这应该做我需要的。 – 2012-08-15 23:11:37