固定正整数 n
和 k
。
令 A
为长度为 n
的数组,其中 A[i]
是长度为 k
的数组,每个条目都是 n-i
。例如,当 n=5
且 k=1
时,这只是
[ [5] , [4] , [3] , [2] , [1] ]
对于 n=5
和 k=2
,这是
[ [5,5] , [4,4] , [3,3] , [2,2] , [1,1] ]
目标是通过交换相邻数组中的数字(例如,将
A [i] [j1]
与A [i + 1] [j2]
交换),以使每个A [i]
的条目都为i + 1
,直到排序此数组的数组为止。问题是:需要多少次交换,以及什么是最佳算法?注意:有许多更好的排序算法可用。但是,对于此问题,我只对应用上述冒泡排序感兴趣。我只能交换相邻数组的条目,并且我只对必要的最小交换次数感兴趣。我很感谢所有关于其他排序算法的建议,但这是我试图理解的问题。
示例:
对于
k = 1
,这是众所周知的。交换次数是将A
视为排列的倒置数,因此最小交换次数是二项式系数(n choose 2) = n(n-1)/2
,可以通过交换任何顺序不正确的对来实现:A[i]>A[j]
。对于第一个示例,这是一个最佳的冒泡排序:[ [5] , [4] , [3] , [2] , [1] ]
[ [4] , [5] , [3] , [2] , [1] ]
[ [4] , [5] , [2] , [3] , [1] ]
[ [4] , [2] , [5] , [3] , [1] ]
[ [4] , [2] , [5] , [1] , [3] ]
[ [4] , [2] , [1] , [5] , [3] ]
[ [4] , [1] , [2] , [5] , [3] ]
[ [1] , [4] , [2] , [5] , [3] ]
[ [1] , [4] , [2] , [3] , [5] ]
[ [1] , [2] , [4] , [3] , [5] ]
[ [1] , [2] , [3] , [4] , [5] ]
对于 k=2
,使用相同的策略需要进行 2 (n choose 2)
次交换。对于上面的例子,这意味着需要进行 20
次交换。但是有一种解决方案只需要进行 15
次交换:
[ [5,5] , [4,4] , [3,3] , [2,2] , [1,1] ]
[ [5,4] , [5,4] , [3,3] , [2,2] , [1,1] ]
[ [5,4] , [3,4] , [5,3] , [2,2] , [1,1] ]
[ [5,4] , [3,4] , [2,3] , [5,2] , [1,1] ]
[ [5,4] , [3,4] , [2,3] , [1,2] , [5,1] ]
[ [5,4] , [3,4] , [2,1] , [3,2] , [5,1] ]
[ [5,4] , [3,1] , [2,4] , [3,2] , [5,1] ]
[ [1,4] , [3,5] , [2,4] , [3,2] , [5,1] ]
[ [1,4] , [3,2] , [5,4] , [3,2] , [5,1] ]
[ [1,4] , [3,2] , [2,4] , [3,5] , [5,1] ]
[ [1,4] , [3,2] , [2,4] , [3,1] , [5,5] ]
[ [1,4] , [3,2] , [2,1] , [3,4] , [5,5] ]
[ [1,4] , [1,2] , [2,3] , [3,4] , [5,5] ]
[ [1,1] , [4,2] , [2,3] , [3,4] , [5,5] ]
[ [1,1] , [2,2] , [4,3] , [3,4] , [5,5] ]
[ [1,1] , [2,2] , [3,3] , [4,4] , [5,5] ]
这个解决方案对于
n=5
和k=2
是最优的(通过暴力找到所有解的证明)。对于n=6
,最佳解需要22
次交换,但解决方案看起来不像n=5
那样好(先向右走5步,然后向左走1步,再向右走5步等等),所以我仍然不知道最优策略,更不用说公式或更好的交换次数上界了。我已经思考了几天,没有想出任何有启发性的东西。如果有人对这个问题有任何想法,请分享。我很想了解
k=2
情况的更多信息。对于一般情况的任何想法都更好。编辑:如果我无法激发您对此问题的兴趣,请原谅,但这里有一个尝试:排序排列所需的冒泡排序次数是组合数学和数论中非常重要的统计量,称为排列的逆序数。您可以使用更好的算法对无序排列进行排序,但这是给您提供代数意义的算法。如果这没有帮助,也许这篇相关的SO文章可以:冒泡排序有什么用处?
更新:下面最老的答案给出了交换次数的下限和上限。第二老的答案提供的算法非常接近这个下限(通常达到它)。如果有人能够改进这个下限,或者更好的是,证明下面给出的算法是最优的,那将是很棒的。
k=1
时的结果应该是[ [1], [2], [3], [4], [5] ]
,这可以在2次交换中获得,而不是10次。我错在哪里了? - svick