繁体   English   中英

java中的高效排列算法

[英]Efficient arrangement algorithm in java

我正在尝试编写一种方法来计算订单重要的电源组的所有排列。 我相信这些被称为“安排”。 我的意思是:

{a} -> {{a}, {}}
{a,b} -> {{a,b}, {b,a}, {a}, {b}, {}}
{a,b,c} -> {{a,b,c}, {a,c,b}, {b,a,c}, {b,c,a}, {c,a,b}, {c,b,a}, {a,b}, {a,c}, {b,a}, {b,c}, {c,a}, {c,b}, {a}, {b}, {c}, {}}

我的印象是,给定一个集合S,我应该生成S的powerset的每个子集的每个排列。所以首先生成powerset,然后将置换函数映射到每个集合上。

问题是这非常复杂 - 类似O(Σn!/ k!),k = 0..n。

我想知道是否有任何现有算法可以非常有效地执行此类操作(可能是并行实现)。 或者即使存在并行powerset算法并且存在并行置换算法,我也可以将两者结合起来。

思考?

谷歌提供的番石榴库包含不同的方法来置换集合。

请在此处查看com.google.common.collect.Collections2类的javadoc。

为此,首先生成1-n个槽的组合,其中n是功率组中的元素数。 例如,如果您有3个元素,那么您将拥有:

C(3,3)= 1组合(abc)
C(3,2)= 3种组合(ab)(ac)(bc)
C(3,1)= 3种组合(a)(b)(c)

现在,您为每个组合生成排列。

存在众所周知的算法来计算排列和组合。 例如,Knuth的“计算机程序设计的艺术”,第4A卷,第7.2.1.2节和第7.2.1.3节,详细解释了如何构建相关的算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM