计数序列数

时间:2014-06-19 20:01:37

标签: algorithm math combinations permutation discrete-mathematics

问题是:
给定一系列正整数 A = {1,2,3,...,N}
计算制作后可获得的序列数对于给定的 N K 相邻的互换>?
我的方法:
我解决这样一个编程问题的算法非常幼稚。我只能考虑进行所有可能的k交换然后计算序列。
任何人都可以用更好的算法帮助我吗?

1 个答案:

答案 0 :(得分:3)

反转数

此类问题(交换相邻元素)的关键是在每次交换后考虑排列中的反转次数。

如果a [i]>,则[i]和[j]两个元素形成反转。 a [j]和i<学家

置换中的反转次数是形成反转的元素对的数量。

这是有用的原因是因为无论何时执行相邻元素的交换,反转计数要么增加1,要么减少1.

提示解决问题

因此,在K交换后,反转的总数必须是以下值之一:K,K-2,K-4等。

因此,我们将问题简化为用K或K-2或K-4等反演来计算排列数。具有给定反转次数的排列数由triangle of Mahonian numbers给出。

解决问题的代码

您需要做的就是计算三角形的第N行(可以找到代码here),然后对相应的条目求和:

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