我正在寻找一种只计算一半可能排列的算法。例如,元素a b c具有以下排列:
a b c
a c b
b a c
b c a
c a b
c b a
当排列是另一个排列的相反(以相反顺序)时,它们被认为是相同的。例如,(a b c)〜(c b a)。我需要算法只计算一半的排列。在这种情况下,可以是(a b c)(a c b)(b a c)或(c b a)(b c a)(c a b)。我认为不同的3组也是可能的,这取决于算法。
我试过搜索这个算法,所有我都找到了使用包含函数和排列索引的语言特定算法。我需要一个通用的伪代码。我正在使用VB.NET
谢谢!
答案 0 :(得分:4)
你可以这样做:
index[end] > index[beginning]
; ,例如,4个要素:
a * * b -> a c d b, a d c b
a * * c -> a b d c, a c d b
a * * d -> a b c d, a c b d
b * * c -> b a d c, b d a c
b * * d -> b a c d, b c a d
c * * d -> c a b d, c b a d
由于第一个和最后一个元素在以这种方式生成排列时永远不会是另一个排列的最后一个和第一个元素,并且您正在生成完全n! / 2
个排列,因此保证您只获得所有排列的一半排列。
答案 1 :(得分:1)
与生成正常的一样,只是在最后一个词典之前。所以你先放在第一位,然后所有的lex在最后和其他中间通常更大。
这个条件也可以用作过滤器来过滤掉不需要的东西,如果这样做更简单。
答案 2 :(得分:0)
谢谢你的帮助。我会发布我的伪代码来解决这个问题,以防将来有人需要它:
SET of size (n)
SUBSET of size (n-2)
for i=1 to n
for j=i+1 to n
create SUBSET = SET \ { SET[i] , SET[j] }
do permutations loop, function for SUBSET
{
calculate a permutation P for SUBSET
construct full permutation FP = SET[i] & P & SET[j]
print or use FP
continue permutations loop
}
next j
next i