如何使用数学归纳证明合并工作?

时间:2015-02-02 00:41:06

标签: algorithm math

以下是指向homework的链接。

我只想帮助解决合并的第一个问题,并自己完成第二部分。我理解归纳的第一部分证明了算法对于最小的情况是正确的,即如果X是空的而另一个是如果Y是空的,但我不完全理解如何证明第二步归纳:显示合并是正确的,输入大小为k + 1。

我之前已经在方程式上进行了归纳,从未在算法上进行过归纳。

谢谢!

1 个答案:

答案 0 :(得分:5)

第一个假设:您使用的合并例程将两个已排序的数组合并为一个已排序的数组。 第二个假设:合并例程终止

  • 基本情况: n = 1,1个元素的数组始终排序
  • 归纳假设:合并排序适用于n = 1,2,...,k
  • 归纳步骤: n = k + 1

现在我们需要证明归纳步骤是正确的。

合并排序将数组拆分为两个子阵列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)== 0&&尺寸(Y)> = 0 =>返回Y ||尺寸(Y)== 0&&尺寸(X)> = 0 => X,这是正确的,因为X和Y都被排序并且将排序的数组与空数组合并产生相同的非空数组
  • X上的归纳假设:合并适用于合并(n,大小(Y)),其中n = 1,2,3,...,k&&尺寸(Y)> = 0
  • Y上的归纳假设:合并适用于合并(大小(X),m),其中m = 1,2,3,...,l&&尺寸(X)> = 0
  • X上的感应步骤: n = k + 1
  • 感应步骤超过Y: m = l + 1

对于X的第一个诱导步骤,我们有2个案例,除了基本情况:

  • X [1]< Y [1] => X[1] ⊕ merge(tail(X), Y) =>这是正确的,因为merge(k, size(Y))根据我们对X的假设是正确的,我们将较小的元素放在前面,所以我们保持顺序
  • X [1]> = Y [1] => Y[1] ⊕ merge(X, tail(Y)) =>这里我们有两个选择:
    • size(tail(Y)) = 0 =>我们打了一个基础案例,因此这个案例被证明是正确的
    • size(tail(Y)) > 0 =>我们进一步推断最终达到基本情况或merge(tail(X), subarray(Y)) size(tail(X)) = k =>我们的归纳假设证明了这一点

类似于Y的诱导步骤:

  • X [1]> = Y [1] => Y[1] ⊕ merge(X, tail(Y)) => this is true by our hypothesis合并(size(X),l)`为真,我们将较小的元素放在前面
  • X [1]< Y [1] => X[1] ⊕ merge(tail(X), Y) =>这里我们有两个选择:
    • size(tail(X)) = 0 =>我们打了一个基础案例,因此这个案例被证明是正确的
    • size(tail(X)) > 0 =>我们进一步推断最终达到基本情况或merge(subarray(X), tail(Y)) size(tail(Y)) = l =>我们的归纳假设证明了这一点

算法终止,因为我们正在使每个步骤中的一个数组减少1个元素,因此其中一个最终将达到我们的基本情况