Algorithm 计数序列数

Algorithm 计数序列数,algorithm,math,combinations,permutation,discrete-mathematics,Algorithm,Math,Combinations,Permutation,Discrete Mathematics,问题是: 给定一个正整数序列a={1,2,3,…,N}。对给定的N进行K次相邻交换后,计算可以得到的序列数? 我的方法: 我解决这样一个编程问题的算法非常幼稚。我只能考虑进行所有可能的k交换,然后计算序列 有谁能帮我找到更好的算法吗?反演 这种类型的问题(交换相邻元素)的关键是考虑每次交换后置换中的倒数。 如果a[i]>a[j]且i

问题是:
给定一个正整数序列a={1,2,3,…,N}。
对给定的N进行K次相邻交换后,计算可以得到的序列数?
我的方法:
我解决这样一个编程问题的算法非常幼稚。我只能考虑进行所有可能的k交换,然后计算序列
有谁能帮我找到更好的算法吗?

反演

这种类型的问题(交换相邻元素)的关键是考虑每次交换后置换中的倒数。 如果a[i]>a[j]且i 排列中的反转数是形成反转的元素对的数目

这之所以有用,是因为每当执行相邻元素的交换时,反转计数要么增加1,要么减少1

解决问题的提示 因此,在K交换之后,反转总数必须是以下值之一:K、K-2、K-4等

所以我们把这个问题归结为一个用K或K-2或K-4等倒数来计算置换数的问题。具有给定数目的逆的置换数由下式给出

解决问题的代码 您需要做的就是计算三角形的第N行(可以找到代码),然后对适当的条目求和:

row = mahonian_row(N)
print sum(row[n] for n in range(K+1) if n%2==K%2 and n<len(row))
row=mahonian_行(N)

打印范围(K+1)中n的总和(第[n]行)如果n%2==K%2,nPerhaps将这个问题转移到:似乎是非常基本的问题和统计。如果它是任意两个元素的交换而不是相邻元素的交换呢?在这种情况下,你应该开始考虑置换的循环分解。置换的循环分解会告诉你需要多少非相邻的交换(通过简单地从循环的长度中减去1),那么您将计算出可能分解为具有长度约束的循环的数量。这很可能涉及Pascal三角形中的条目之和,而不是Mahonian三角形。