我决定检查与几个假设/变化的问题,因为它使人们更有趣的问题,对我说:
1)您可以向左或向右移动从一堆的任何部分内容。
2)你可以将一个元素堆叠到一个堆上,无论它是更大,更小还是相同的大小。
3)数组被认为是只要你永远不小的数字前遇到比较大的数字,无论你如何去通过堆排序。所以_ 11 2 3排序,但_ _ 12 3是不是因为你能解释2为前1
这导致了一个非常有趣的问题,尽管这个公理:
公理A :您进行移动的顺序无关紧要,可以通过任何方式进行重新排列,以达到相同的最终结果。
公理AB:如果阵列中有没有重复序列,然后简单地每个元件移动朝向其最终位置。
特别,我制定了一项战略,希望你可以只用当地的检查也没有递归/回溯解决这个问题,但我已经证明这是徒劳,而且以后会表现出来。
我的策略是:
1)继续从左至右寻找那被翻转错误的方式(较低的号码前一个较大的数字)对。
2A)当你找到一个,如果有一个空白处或堆栈右手值可以马上补,将其向左,直到它填满它。
2b)否则,将左边的值向右移动一个。这会造成一种情况,即您有一堆无所谓的数字 - 首先,根据1)的逻辑将向右移动的值与其新右边的值进行比较,然后再进行比较。
2bii)治疗向下比较的方式为一对相同的比较 - 移动,如果它可以适应的空白处或堆叠,否则移动较高值权,并继续留在较低的值。
实例:
1231 - >我们转向图1b左侧,因为它会适合到一个堆栈。 11 2 3 _
1321 - >我们转向3向右因为2不适合到空斑/入栈。我们将1b左移两次,因为它会适合一个空白点/适合堆叠,然后我们右移3,因为2不会适合空白点/堆叠。 1 1 2 3
1132 - >我们将3右移,因为2不能左移。我们向左移2,因为它会适合一个空的地方。 1 1 2 3
2311 - >我们将3右移,因为1a不能离开。我们将1b移两次,因为它会适合一个空的地方。我们将1a移向左边,因为它会叠加。我们将2右移,因为1a1b不能离开。我们将1a2b左移,因为它将填满空位。 11 2 3 _
然而,我们碰到与这两个起始阵列一个问题:
23411 10移动最佳,2R,3R,4R 1AL * 3 1BL * 4使11 2 3 4 _。
23111 9移动最优化,2r * 3 3r * 3 1bl 1cl * 2使_111 2 3 - 与23411策略相反!我们移动1更少,23更多,因为有更多的1,所以我们保存移动尽可能少的移动。
这表明我们不能只是做一个简单的本地比较来解决这个新问题。
我还在思考这个问题,它似乎是在一个有趣的方式不平凡的,我希望你们当中有些人喜欢与我考虑这个:)
这还不清楚。你的数组在多大程度上允许“空白空间”? “在相邻元素上移动”意味着什么? – 2013-04-09 00:42:01
@OliCharlesworth - 我怀疑这是一个算法分析问题,而不是一个编程问题,因为它要求*最小移动数*,而不是排序数组 – 2013-04-09 00:43:39
@SamDufel:这也是我的怀疑。即便如此,我认为我们需要一些坚定的定义/图表才能真正帮助。 – 2013-04-09 00:44:27