Mencoba memahami bukti Koreksi Quicksort ini

10

Bukti ini adalah bukti melalui induksi, dan berlaku sebagai berikut:

P (n) adalah pernyataan bahwa "Quicksort dengan benar mengurutkan setiap larik input dengan panjang n."

Kasus dasar: setiap larik input dengan panjang 1 sudah diurutkan (P (1) berlaku)

Langkah induktif: fix n => 2. Perbaiki beberapa larik input dengan panjang n.

Perlu ditunjukkan: jika P (k) berlaku untuk semua k <n, maka P (n) juga berlaku

Dia kemudian menggambar array A yang dipartisi di sekitar pivot p. Jadi dia menggambar p, dan memanggil bagian dari array yang <p sebagai bagian 1, dan bagian yang> p adalah bagian kedua. Panjang bagian 1 = k1, dan panjang bagian 2 adalah k2. Dengan bukti ketepatan subrutin Partition (dibuktikan sebelumnya), pivot p berakhir pada posisi yang benar.

masukkan deskripsi gambar di sini

Dengan hipotesis induktif: Bagian ke-1 disortir dengan benar oleh panggilan rekursif. (Menggunakan P (K1), P (k2))

Jadi: setelah panggilan berulang, seluruh array diurutkan dengan benar.

QED

Kebingungan saya : Saya memiliki banyak masalah dalam melihat dengan tepat bagaimana ini membuktikan kebenarannya. Jadi kita mengasumsikan bahwa P (k) memang berlaku untuk semua bilangan alami k <n.

Sebagian besar bukti induksi yang telah saya lihat sejauh ini seperti: Buktikan kasus dasar, dan tunjukkan bahwa P (n) => P (n +1). Mereka biasanya juga melibatkan semacam manipulasi aljabar. Bukti ini tampaknya sangat berbeda, dan saya tidak mengerti bagaimana menerapkan konsep Induksi ke sana. Saya agak dapat beralasan bahwa kebenaran subrutin Partisi adalah kuncinya. Jadi adalah alasan untuk kebenarannya sebagai berikut: Kita tahu bahwa setiap panggilan rekursif, ia akan mempartisi array di sekitar pivot. Pivot ini akan berada pada posisi yang seharusnya. Kemudian setiap subarray akan dipartisi lebih lanjut di sekitar pivot, dan pivot itu kemudian akan berada di posisi yang seharusnya. Ini akan terus berlanjut sampai Anda mendapatkan subarray dengan panjang 1, yang disortir secara sepele.

Tetapi kemudian kita tidak berasumsi bahwa P (k) berlaku untuk semua k <n .... kita benar-benar MENUNJUKKAN itu terjadi (karena subrutin Partisi akan selalu menempatkan satu elemen dalam posisi yang selayaknya.) Apakah kita tidak berasumsi bahwa P (k) (k) berlaku untuk semua k

FrostyStraw
sumber
Apa itu "QUE"? Apakah maksud Anda "QED"? (the Latin Quod Erat Demonstrandum yang tidak mengandung kata mulai untuk U )
Bakuriu
1
Saya memang bermaksud QED. Saya kira kebingungan saya membuat saya menulis "APA?" in spanish
FrostyStraw

Jawaban:

13

Kita memang mengasumsikan berlaku untuk semua . Ini adalah generalisasi dari gaya bukti "From , kami membuktikan " yang Anda kenal.k < n P ( n - 1 ) P ( n )P(k)k<nP(n1)P(n)

Bukti yang Anda gambarkan dikenal sebagai prinsip induksi matematika yang kuat dan memiliki bentuk

Misalkan adalah predikat yang ditentukan pada . Jika kita bisa menunjukkan itun { 1 , 2 , ... }P(n)n{1,2,}

  1. P(1) benar, dan

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

Maka benar untuk semua bilangan bulatP(n) .n1

nknk1

k<nnk1<n

Rick Decker
sumber
2
P(1)n=1k<1,P(k)P(1)
Oke jadi ... untuk memperjelas ... Kita MENANGGUNG P (k) berlaku untuk semua k <n. Dan cara kami MENUNJUKKAN bahwa P (k) ==> P (n) (untuk semua k <n) adalah melalui kombinasi mengetahui bahwa pivot pasti akan berada di posisi yang benar, dan melalui asumsi (hipotesis induktif ) bahwa subarrays kiri dan kanan juga diurutkan. Gabungkan itu dengan kasus dasar (di mana k = 1 <n), dan buktinya selesai?
FrostyStraw
baik saya kira itu tidak akan cukup untuk mengetahui bahwa pivot berada di posisi yang benar, tetapi juga bahwa subarray kanan semua lebih besar daripada pivot dan yang kiri kurang dari
FrostyStraw
@FrostyStraw Ini bisikan Cina.
Raphael
1
@ FrostyStraw Hehe, maksud saya strategi buktinya. :)
Raphael
7

Bukti ini menggunakan prinsip induksi lengkap :

Seandainya:

  • P(1)
  • n>1P(1),,P(n1)P(n)

P(n)n1

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

Sekarang, mari kita gunakan induksi lengkap untuk membuktikan bahwa versi Quicksort berikut mengurutkan inputnya dengan benar:

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

Berikut A[1],...,A[n]adalah array input, dan npanjangnya. Pernyataan yang ingin kami buktikan adalah sebagai berikut:

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)
Yuval Filmus
sumber
4

Bagian yang hilang dari argumen adalah transitivitas '<' - yaitu properti yang jika a <b dan b <c, maka a <c. Bukti bahwa array terakhir diurutkan berjalan seperti ini:

Biarkan A [i], A [j] menjadi elemen dari array post-sort, di mana saya <j. Kemudian A [i] <A [j] mengikuti dari salah satu case penempatan berikut (dan tidak ada case lain):

(a) i dan j berada di partisi pertama - A [i] <A [j] diikuti oleh rekursi / induksi.

(B) i dan j berada di partisi kedua - A [i] <A [j] diikuti oleh rekursi / induksi.

(c) i ada di partisi pertama dan j adalah indeks pivot - A [i] <A [j] diikuti oleh bukti prosedur partisi.

(c) i adalah indeks pivot dan j berada di partisi kedua - A [i] <A [j] diikuti oleh bukti prosedur partisi.

(e) i ada di partisi pertama dan j ada di partisi kedua - kemudian dengan prosedur partisi, A [i] <pivot, dan pivot <A [j]. Jadi dengan transitivitas, A [i] <A [j].

PMar
sumber