假设有一个无序列表。我们唯一可以做的操作是移动一个元素并将其插回任何地方。对整个列表进行排序需要多少步骤?
我猜答案是size of the list - size of longest ordered sequence
,但我不知道如何证明它。
答案 0 :(得分:5)
首先请注意,移动元素不会改变被移动元素的相对顺序。
考虑最长的非递减子序列(与the longest increasing subsequence密切相关 - 找到它们的方式相似)。
通过仅移动不在此序列中的元素,很容易看出我们最终得到了一个排序列表,因为此序列中的所有元素已经相对于彼此进行了排序。 / p>
如果我们不移动此序列中的任何元素,则此子序列中两个元素之间的任何其他元素将保证大于较大元素,或小于较小元素(如果不是这样,它本身将是最长的序列),因此需要移动 (见下文)
是否需要不减少?是。考虑此序列中的两个连续元素是否正在减少。在这种情况下,如果不移动这两个元素就不可能对列表进行排序。
为了最大限度地减少所需的移动次数,只需选择最长的序列即可,如上所述。
因此,所需的移动总数是列表的大小减去最长的非递减子序列的大小。
解释不在上述非递减子序列中的元素值的示例:
考虑最长的非递减子序列1 x x 2 x x 2 x 4
(x
' s是一些不属于序列的元素。)
现在考虑x
和2
之间4
的可能值。
如果是2,3或4,则最长的子序列将包括该元素。如果它大于4
或小于2
,则需要将其移动。
答案 1 :(得分:-1)
很容易证明size of the list - size of longest ordered sequence
总是足以对任何序列进行排序,例如数学归纳法。
您还可以轻松地证明,对于某些无序序列,只需找到这样无关紧要的序列就可以做到最好。例如。要对序列3,1,2进行排序,你需要移动一个项目(3),并且可以看到它不能更快,显然size of the list - size of longest ordered sequence
等于1。
然而,证明它对所有序列都是最好的是不可能的,因为该语句实际上并不正确:反例是具有多个已排序子序列的序列S[i]
,其中max(S[i]) < min(S[i+1])
为每个i
。例如,参见序列1,2,3,1000,4,5,6。