我们有一个序列 从1到n(n <= 20),例如:{1,2 ... 20}, 如果我通过交换数组元素
for(i : 1 to n)
j = rand(1 to n) (rand= random function)
swap(a[i],a[j])
由于上述算法可以对给定数组产生不同的排列,因此可以找到重复次数最多和次数最少的序列。
for ex = {1,2}
for i=1 and j=1, no swap
i=1 and j=2, {2,1}
i=2 and j=1, {2,1}
i=2 and j=2, no swap {1,2}
我试图通过next_permutation函数生成所有排列,但是对于n = 20,它花费了太多时间,并且我试图计算序列数,但是问题是相同的,因为函数增长为n^n
,并且为20 ^ 20是不可能的。是否可以计算出哪个序列将出现最大次数和最小次数而没有找到所有排列?
我也尝试使用递归,但是问题与我的函数的增长是n^n
相同,并且我尝试为n = 3构造树并得到
{123 - 4 times , 213 - 5 times , 132 - 5times, 231 - 5 times, 321 - 4 times and 312 - 4 times}
因为213达到最大次数,而321达到最小次数,但是对于大n来说不是真的吗?
如何决定?只是一个提示?