以下是指向homework的链接。
我只想帮助解决合并的第一个问题,并自己完成第二部分。我理解归纳的第一部分证明了算法对于最小的情况是正确的,即如果X是空的而另一个是如果Y是空的,但我不完全理解如何证明第二步归纳:显示合并是正确的,输入大小为k + 1。
我之前已经在方程式上进行了归纳,从未在算法上进行过归纳。
谢谢!
答案 0 :(得分:5)
第一个假设:您使用的合并例程将两个已排序的数组合并为一个已排序的数组。 第二个假设:合并例程终止
现在我们需要证明归纳步骤是正确的。
合并排序将数组拆分为两个子阵列L = [1,n/2]
和R = [n/2 + 1, n]
。根据上述事实,看ceil(n/2)
小于k
。通过我们的归纳假设,L和R的合并排序结果都被正确排序(因为它们在[1,k]
范围内)。此外,从我们的假设合并例程将它们合并到一个排序数组,其中包含所有元素,因为size(L) + size(R) = n
所以这意味着它正确地排序了一个大小为n = k+1
的数组。
@Edit:对不起,想念。对于合并部分:
在这里,我们将有一个多维感应。
假设:输入数组X,Y已经排序
对于X的第一个诱导步骤,我们有2个案例,除了基本情况:
X[1] ⊕ merge(tail(X), Y)
=>这是正确的,因为merge(k, size(Y))
根据我们对X的假设是正确的,我们将较小的元素放在前面,所以我们保持顺序Y[1] ⊕ merge(X, tail(Y))
=>这里我们有两个选择:
size(tail(Y)) = 0
=>我们打了一个基础案例,因此这个案例被证明是正确的size(tail(Y)) > 0
=>我们进一步推断最终达到基本情况或merge(tail(X), subarray(Y))
size(tail(X)) = k
=>我们的归纳假设证明了这一点类似于Y的诱导步骤:
Y[1] ⊕ merge(X, tail(Y)) => this is true by our hypothesis
合并(size(X),l)`为真,我们将较小的元素放在前面X[1] ⊕ merge(tail(X), Y)
=>这里我们有两个选择:
size(tail(X)) = 0
=>我们打了一个基础案例,因此这个案例被证明是正确的size(tail(X)) > 0
=>我们进一步推断最终达到基本情况或merge(subarray(X), tail(Y))
size(tail(Y)) = l
=>我们的归纳假设证明了这一点算法终止,因为我们正在使每个步骤中的一个数组减少1个元素,因此其中一个最终将达到我们的基本情况