このクイックソートの正当性の証明を理解しようとしています


10

この証明は帰納法による証明であり、次のようになります。

P(n)は、「クイックソートが長さnのすべての入力配列を正しくソートする」という表明です。

基本ケース:長さ1のすべての入力配列は既にソートされています(P(1)が保持されます)

帰納的ステップ:n => 2を修正します。長さnの入力配列を修正します。

表示する必要があります:P(k)がすべてのk <nに対して成り立つ場合、P(n)も成り立ちます

次に、ピボットpの周りに分割された配列Aを描画します。したがって、彼はpを描画し、配列の<pである部分を最初の部分として呼び出し、> pである部分を2番目の部分として呼び出します。パーツ1の長さ= k1、パーツ2の長さはk2です。(前に提供された)Partitionサブルーチンの正確性の証明により、ピボットpは正しい位置に巻き上げられます。

ここに画像の説明を入力してください

帰納的仮説:1番目、2番目の部分は再帰呼び出しによって正しくソートされます。(P(K1)、P(k2)を使用)

したがって、再帰呼び出しの後、配列全体が正しくソートされます。

QED

私の混乱:これが正確さをどのように証明するかを正確に確認するのに多くの問題があります。したがって、P(k)が実際にすべての自然数k <nに対して成立すると仮定します。

これまでに見た誘導証明のほとんどは、次のようなものです。基本ケースを証明し、P(n)=> P(n + 1)であることを示します。それらは通常、ある種の代数的操作も含みました。この証明は非常に異なっているように見え、誘導の概念をそれに適用する方法がわかりません。私は、Partitionサブルーチンの正確さが鍵であるといくぶん推論できます。したがって、その正確さの理由は次のとおりです。再帰呼び出しのたびに、ピボットの周りで配列が分割されることがわかっています。その後、このピボットはその正しい位置になります。次に、各サブアレイはピボットを中心にさらに分割され、そのピボットは正しい位置に配置されます。これは、長さ1のサブ配列を取得するまで繰り返し行われます。

しかし、P(k)がすべてのk <nに当てはまるとは想定していません。実際にそれを示しています(Partitionサブルーチンは常に1つの要素を正しい位置に配置するため)。Pを想定していませんか? (k)すべてのkに当てはまる


「QUE」とは何ですか?「QED」ですか?(ラテンQUOD ERAT Demonstrandumの開始任意の単語が含まれていませんUは
Bakuriu

1
確かに私はQEDを意味していました。私の混乱が私に「何を」書いたのだろうと思います。スペイン語
FrostyStraw 2016

回答:


13

実際、すべてのに対してが成り立つと仮定しています。これは、「、を証明する」という証明形式を一般化したものです。k < n P n 1 P n P(k)k<nP(n1)P(n)

あなたが説明する証明は強力な数学的帰納法の原理として知られており、形式は

が定義された述語であると仮定します。それを示すことができればのn { 1 2 ... }P(n)n{1,2,}

  1. P(1)は真であり、

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

次に、はすべての整数に対して真です。N 1P(n)n1

あなたが参照する証明では、それがまさに起こっていることです。クイックソートを使用してサイズ配列をソートするには、最初のサブ配列、ピボット(正しい位置に配置されます)、およびサイズ残りのサブ配列の3つに分割します。パーティションが機能することにより、最初のサブ配列のすべての要素はピボット以下になり、他のサブ配列のすべての要素はピボット以上になるため、最初と最後のサブ配列を再帰的にソートすると、配列全体をソートした後、終了します。k n k 1nknk1

これは、強い帰納法によって正しいことを示しています。最初のサブ配列には要素があるため、帰納法によって正しくソートされると想定できます。2番目のサブ配列には要素があるため、正しく並べ替えられると想定できます。したがって、すべてのピースをまとめると、配列をソートしたことになります。n k 1 < nk<nnk1<n


2
強力な誘導の原理のクールな部分は、ベースケースが必要ないことです。我々が取る場合、N = 1誘導工程において、次いで先行K < 1 P kは我々は持っているので、空虚であるP 1 無条件。P(1)n=1k<1,P(k)P(1)
Mario Carneiro 2016

わかりました...明確にする必要があります...すべてのk <nでP(k)が真であると仮定します。そして、P(k)==> P(n)(すべてのk <nに対して)を示す方法は、ピボットが確実に正しい位置にあることを知ることと、仮定(帰納的仮説)を組み合わせることです。 )左と右のサブ配列もソートされること。これをベースケース(k = 1 <n)と組み合わせると、証明は完了しますか?
FrostyStraw 2016

まあ、ピボットが正しい位置にあることを知るだけでは不十分だと思いますが、右側のサブアレイがすべてピボットより大きく、左側のサブアレイがすべて小さいことも
わかります

@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、その長さです。証明したいステートメントは次のとおりです。

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].
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は2番目のパーティションにあります-A [i] <A [j]の後に再帰/帰納法が続きます。

(c)iは最初のパーティションにあり、jはピボットのインデックスです。A[i] <A [j]は、パーティションの証明手順に従います。

(c)iはピボットのインデックスであり、jは2番目のパーティションにあります-A [i] <A [j]は、パーティション手順の証明に従います。

(e)iが最初のパーティションにあり、jが2番目のパーティションにある-パーティションプロシージャでは、A [i] <ピボット、ピボット<A [j]。したがって、推移性によって、A [i] <A [j]となります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.