这是一个理论/数学问题。也许有人会找到它的用途。
我正在重新排列Inkscape中的一些图层,试图反转整个堆栈,我想知道什么是最快(即最少移动)的方式来反转列表给定约束,你只能交换两个相邻的项目时间。
最简单的方法类似于冒泡排序:
a,b,c,d,e,f - > b,a,c,d,e,f - > b,c,a,d,e,f - > b,c,d,a,e,f - > ... - > F,E,d,C,B,A
但是有更快的方法吗?
答案 0 :(得分:3)
不,我认为你所拥有的是掉期数量最少。你有执行五个以便a
到达结尾,然后再执行四个以使b
到达倒数第二个位置,依此类推。
移动a
时进行的任何其他互换都不会导致a
更近。
因此{a, b, c, d, e, f}
的最小交换计数为5 + 4 + 3 + 2 + 1
。这与冒泡排序一样有效,因此对于任何体面的数据都应该避免。但是,如果数据大小足够小,没有人注意到,即使冒泡也是可以的。
在我看来,如果您的域名是Inkscape,那么您实际上不会拥有特别多的图层。对于更通用的域,您必须吮吸它并查看: - )
答案 1 :(得分:0)
最快的方法是从最后一个元素到第一个元素遍历相同的列表。根本没有互换。