有效地寻找独特的排列

时间:2012-10-28 14:34:25

标签: matlab math permutation combinatorics

我有以下问题。我需要计算一组的排列;但是,该集合可能包含两个相同的元素,因此会导致重复的排列。例如:

给定集合[ 0 0 1 2 ],排列包括这些可能性:

 1     2     0     0
 1     2     0     0

但是,我想避免使用相同的排列。在MATLAB中我可以这样做:

unique(perms([ 0 0 1 2 ]), 'rows')

但问题在于效率 - 我在一个巨大的for循环中反复这样做,unique所需的排序太慢了。所以我的问题是:我可以直接直接计算这种性质的独特排列吗,而不必事后循环结果吗?我在MATLAB工作,但只是一个通用的解决方案可能会有所帮助,虽然可以在MATLAB中矢量化的东西可能是理想的!

据我所知,现有的问题并没有完全涵盖这个问题,但如果以前已经回答过,请道歉。

1 个答案:

答案 0 :(得分:3)

这似乎是一个经常出现的问题。 Here是John d'Errico(uniqueperms)的文件,它似乎非常有效地解决了这个问题。作为替代方案,Ged Ridgway还提交了另一份FEX提交here;你需要分析一下,看看哪一个更快。

请注意,由于Matlab的JIT的限制,如果循环调用非内置函数,则循环不会加速,因此将这些函数的内容复制粘贴(和/或将它们专门化)可能是有益的。环(一个或多个)。