使用旋转和交换对二维环形阵列进行排序

时间:2010-08-10 12:01:16

标签: algorithm sorting multidimensional-array rotation swap

我尝试过考虑算法,但是无法做到。这是问题所在:

有16个元素,按四种类型(a,b,c和d)分组。我们还有四个组,A,B,C和D.

在初始状态下,四个组各有四个随机元素,例如:

A: c, c, a, d
B: b, b, a, a
C: b, b, c, c
D: d, d, d, a

组中元素的顺序很重要。

允许两种操作:

1)旋转组的元素(在两个方向上),例如:

c, c, a, d -> d, c, c, a

2)考虑到第一个和最后一个组和元素也是相邻的,在一个组中交换两个相邻元素与相邻组中的相应元素,所以。:

A: (c, c), a, d
B: (b, b), a, a

->

A: (b, b), a, d
B: (c, c), a, a

A: c), c, a, (d
D: d), d, d, (a

->

A: d), c, a, (a
D: c), d, d, (d

算法的目标是将元素放入相应的组(A: a, a, a, a等)。算法在时间和解决方案上不一定是最优的,但平均来说应该相当快(即没有暴力)。

有人可以帮忙吗?这个算法甚至是多项式的吗?

2 个答案:

答案 0 :(得分:4)

我认为这总是可能的。首先考虑一个字母(比如说b)只出现在X和Y两行中的情况。我们可以通过交换操作确保X和Y相邻。

案例i)

X: b - - -
Y: - b b b

我们可以通过

制作X全部b

Cyclich shift X。

X: - - b - 
Y: - b b b

交换中间

X: - b b -
Y: - - b b

现在循环移位和交换。

案例ii)

X: b - b -
Y: b - b -

制作

X: - b - b
Y: b - b -

交换最后两个。

另一种情况很简单。

现在给出2,3或4行中特定字母的任何分布,我们可以确保它只出现在两行中。我会把它留给你,因为它很容易看到,很难打字!

(如果它只出现在一行中,我们的工作主要是为那封信完成的)

因此算法将

确保仅显示两行。确保行是A和B(稍后交换)。

现在执行以上操作以使A成为aaaa。

忽略A。

考虑B,C,D。确保b仅出现在两行中。如上所述使B成为bbbb。

忽略B。

给定C和D,你可以使用上面的命令使C成为cccc,D将是dddd。

答案 1 :(得分:1)

我最初的想法是尝试某种形式的动态编程 - 问题似乎与Edit Distance相似,因为你有一组有限的操作和一个已知的所需最终状态。动态编程方法将产生多时间算法。但是,就像我说的,这就是我开始搜索算法的地方,我不知道这种方法是否真的有效。如果我稍后再过一段时间,我会有更深入的思考。

希望这有帮助!