试图了解此Quicksort正确性证明


10

该证明是归纳证明,其内容如下:

P(n)是“快速排序对长度为n的每个输入数组正确排序”的断言。

基本情况:每个长度为1的输入数组都已排序(P(1)成立)

归纳步骤:修复n => 2.修复一些长度为n的输入数组。

需要说明:如果对于所有k <n,P(k)成立,那么P(n)也成立

然后,他绘制围绕某个枢轴p划分的数组A。因此,他绘制了p,并将数组<p的部分称为第一部分,将> p的部分称为第二部分。部分1的长度= k1,部分2的长度为k2。通过“分区”子程序的正确性证明(之前已证明),枢轴p缠绕在正确的位置。

在此处输入图片说明

通过归纳假设:第1,第2部分通过递归调用正确排序。(使用P(K1),P(k2))

所以:在递归调用之后,整个数组都将正确排序。

QED

我的困惑:我很难确切地看到这如何证明它的正确性。因此,我们假设P(k)确实适用于所有自然数k <n。

到目前为止,我看到的大多数归纳证明都类似:证明基本情况,并证明P(n)=> P(n + 1)。他们通常还涉及某种代数运算。这个证明似乎有很大的不同,我不理解如何将归纳概念应用到它。我可以合理地推断出Partition子例程的正确性是关键。因此,其正确性的理由如下:我们知道,每个递归调用都会围绕枢轴对数组进行分区。然后,该支点将处于其应有的位置。然后,每个子数组将进一步围绕枢轴进行划分,然后该枢轴将处于其正确位置。这样一直进行下去,直到得到长度为1的子数组,该数组被简单地排序了。

但是然后我们不假设P(k)满足所有k <n...。实际上我们正在展示它(因为Partition子例程将始终将一个元素置于其合法位置。)我们不是假设P (k)持有所有k


什么是“ QUE”?您是说“ QED”吗?(不包含以U开头的任何单词的拉丁语Erat Demonstrandum
Bakuriu

1
我确实是说QED。我想我的困惑导致我写了“什么?” 西班牙文
FrostyStraw

Answers:


13

我们确实假设对于所有。这是您熟悉的“从证明 ”样式的概括。P(k)k<nP(n1)P(n)

您描述的证明被称为强数学归纳原理,其形式为

假设是上定义的谓词。如果我们能证明这一点P(n)n{1,2,}

  1. P(1)为真,并且

  2. (k<n[P(k)])P(n)

那么对于所有整数为真。P(n)n1

在您引用的证明中,这就是正在发生的事情。为了使用quicksort对大小为的数组进行排序,我们将其划分为三部分:第一个子数组,pivot(将位于其正确位置)以及大小为的其余子数组。通过分区的工作方式,第一个子数组中的每个元素将小于或等于枢轴,而另一个子数组中的每个元素将大于或等于枢轴,因此,当我们对第一个和最后一个子数组进行递归排序时,将对整个数组进行排序将结束。nknk1

我们通过强归纳法证明这是正确的:由于第一个子数组具有元素,因此我们可以通过归纳法假定它将被正确排序。由于第二个子数组具有元素,因此我们可以假定它将被正确排序。因此,将所有部分放在一起,我们将对数组进行排序。k<nnk1<n


2
关于强归纳原理的最酷部分是基本情况是不必要的!如果我们在归纳步骤中取,则前是虚无的,因此我们无条件地拥有。P(1)n=1k<1,P(k)P(1)
马里奥·卡内罗

好吧...要明确...对于所有k <n,我们假设P(k)为真。并且我们展示P(k)==> P(n)(对于所有k <n)的方式是通过组合已知枢轴将肯定在其正确位置,以及通过假设(归纳假设) )左右子数组也已排序。将其与基本情况(其中k = 1 <n)结合起来,证明是完整的吗?
FrostyStraw

好吧,我想知道枢轴处于正确位置还不够,而且右子
数组

@FrostyStraw是中国的耳语。
拉斐尔

1
@FrostyStraw Hehe,我的意思是证明策略。:)
拉斐尔

7

该证明使用完全归纳的原理:

假设:

  • 基本情况:P(1)
  • 步骤:对于每个,如果成立(归纳假设),则也成立。n>1P(1),,P(n1)P(n)

然后对于所有。P(n)n1

可以通过考虑属性使用通常的感应原理证明这个原理 我留下细节。

Q(m)P(1) and P(2) and  and P(m)

现在,让我们使用完整的归纳法来证明以下版本的Quicksort正确地对其输入进行了排序:

Quicksort(A, n)
    if n = 1 then:
        return
    else:
        let X[1...x] consist of all elements of A[2],...,A[n] which are at most A[1]
        let Y[1...y] consist of all elements of A[2],...,A[n] which are larger than A[1]
        call Quicksort(X, x)
        call Quicksort(Y, y)
        set A to the concatenation of X, A[1], Y

A[1],...,A[n]是输入数组,n是它的长度。我们要证明的语句如下:

设为长度为的数组。用调用Quicksort后,表示的内容。然后:An1AB

  1. 快速排序终止于。A
  2. 排列为使得。π1,,πn1,,nB[i]=A[πi]
  3. B[1]B[2]B[n]

我只会证明第三个属性,其余的留给您。因此,我们使为以下语句:P(n)

如果是长度为的数组,并且是运行后的内容,则。An1BQuicksort(A, n)B[1]B[2]B[n]

通过对的完全归纳来证明。如果那么没有任何证据可以证明,因此。令与程序中一样。由于,归纳假设表明 此外,从我们形成数组和的方式出发,可以得出。因此, 立即得出。因此,成立。nn=1n>1X,x,Y,yQuicksortx,y<n

X[1]X[2]X[x]Y[1]Y[2]Y[y]
XYX[x]A[1]<Y[1]
X[1]X[x]A[1]<Y[1]Y[y].
P Ñ B[1]B[n]P(n)

4

参数的缺失部分是'<'的传递性 -即如果a <b和b <c,则a <c的属性。最终数组已排序的证明是这样的:

令A [i],A [j]为数组后排序的元素,其中i <j。然后,A [i] <A [j]来自以下放置情况之一(并且没有其他情况):

(a)i和j在第一个分区中-A [i] <A [j]之后是递归/归纳。

(b)i和j在第二个分区中-A [i] <A [j]之后是递归/归纳。

(c)i在第一个分区中,并且j是枢轴的索引-通过分区过程的证明遵循A [i] <A [j]。

(c)i是枢轴的索引,j在第二个分区中-A [i] <A [j]遵循分区过程的证明。

(e)i在第一分区中,j在第二分区中-然后通过分区过程,A [i] <枢轴,而枢轴<A [j]。因此,根据传递性,A [i] <A [j]。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.