没有重复的排列算法?

Posted

技术标签:

【中文标题】没有重复的排列算法?【英文标题】:Algorithm for Permutations without Repetition? 【发布时间】:2012-05-11 14:50:04 【问题描述】:

在我正在为给定的一组字母生成字谜的程序中,我目前的方法是:

    获取所有字母的所有组合 获取每个组合组的排列 按字母顺序对结果排列进行排序 删除重复条目

我的问题与排列的数学有关。我想知道是否有可能在删除重复条目后完全计算存储所有剩余条目所需的数组大小(例如,使用重复字母的数量与排列公式或其他东西结合使用)。

对于我的问题含糊不清,我深表歉意,我仍在研究更多关于组合和排列的信息。随着我对组合和排列的理解的扩展,我将尝试详细说明我的目标,一旦我重新熟悉了我的程序(这是我去年夏天的一个业余项目)。

【问题讨论】:

查看Variations/Permutations without repetition 。有几种不同的解决方案。 【参考方案1】:

如果您有n 元素,一个元素有a[0] 重复,另一个元素有a[1] 重复,依此类推,直到a[k],那么不同排列的总数(最多重复)为n!/(a[0]! a[1]! ... a[k]!).

仅供参考,如果您有兴趣,可以使用Guava 写信

Collection<List<Character>> uniquePermutations = 
  Collections2.orderedPermutations(Lists.charactersOf(string));

结果将是字符的唯一排列,包括重复和所有内容。您甚至可以调用它的.size() 方法——或者只是查看它的实现以获取提示。 (披露:我为 Guava 做出了贡献。)

【讨论】:

他没有问重复的数量,而是如何得到它们。 “我想知道在删除重复条目后是否可以计算出存储所有剩余条目所需的数组大小。”这听起来像是在向我询问不同排列的数量。 听起来更像是/否问题:) 是的,不同的排列听起来就像我正在寻找的。如果您能详细说明您给出的一般解决方案,我将不胜感激,恐怕我不完全理解。特别是 [number] 的含义。看起来您的意思是 a[k] 是给定组合组的重复数,对吗?【参考方案2】:

生成所有排列确实是个坏主意。例如,“溢出”这个词有 40320 个排列。因此,随着单词长度的增加,内存消耗会变得非常高。

我相信您试图解决的问题可以简化为找出一个词是否是另一个词的字谜。

然后您可以通过计算每个字母出现的次数(它将是一个 26 元组)并将这些元组相互比较来解决它。

【讨论】:

以上是关于没有重复的排列算法?的主要内容,如果未能解决你的问题,请参考以下文章

优化一个简单的缺失词算法[重复]

算法剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列(java / c / c++ / python / go / rust)

剑指 Offer II 083. 没有重复元素集合的全排列

重复排列 - 非字谜算法

修改排列算法以防止重复打印输出的策略

46.全排列