【问题标题】:Finding unique permutations efficiently有效地寻找独特的排列
【发布时间】:2012-10-28 14:34:25
【问题描述】:

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

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

 1     2     0     0
 1     2     0     0

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

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

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

据我所知,现有问题并没有完全涵盖这个问题,但如果之前已经回答过这个问题,我们深表歉意。

【问题讨论】:

  • 您真正想解决什么问题?为什么会有一个循环,需要在其中高速查找不同数组的排列?
  • 好点,也许我应该更具体一些,虽然它有点乱。我正在寻找图像之间相应对象集的方法,尽管这些对象有一个与之关联的类。我一次从集合 A 中取出 5 个对象,并找到将它们与集合 B 中的对象对应的所有方法。我通过在每个类中查找排列来解决类限制。这就是为什么会有零:它们表示一个对象没有与另一个对象配对,这就是我不想重复这种排列的原因。

标签: matlab math permutation combinatorics


【解决方案1】:

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

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

【讨论】:

  • 啊,就是这样,非常感谢!我的谷歌搜索能力显然需要练习!
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
相关资源
最近更新 更多