Bu Quicksort Düzeltme kanıtını anlamaya çalışmak


10

Bu kanıt, tümevarımın kanıtıdır ve aşağıdaki gibi devam eder:

P (n) "Quicksort, n uzunluğundaki her girdi dizisini doğru bir şekilde sıralar."

Temel durum: 1 uzunluktaki her giriş dizisi zaten sıralanmıştır (P (1) tutar)

Endüktif adım: n => 2'yi düzeltin. N uzunluğunda bir girdi dizisini düzeltin.

Gösterilmesi gereken: P (k) tüm k <n için tutarsa, P (n) de tutar

Daha sonra, bazı p p noktalarının etrafında bölünmüş bir A dizisi çizer. Böylece p çizer ve dizinin 1. kısım olarak <p olan kısmını çağırır ve ikinci kısım olan> p kısmı. Bölüm 1'in uzunluğu = k1 ve bölüm 2'nin uzunluğu k2'dir. Bölüm alt yordamının (daha önce kanıtlanmıştır) doğruluk kanıtıyla, pivot doğru konumda sarılır.

resim açıklamasını buraya girin

Endüktif hipotezle: 1., 2. bölümler yinelemeli çağrılarla doğru şekilde sıralanır. (P (K1), P (k2) kullanarak)

Yani: özyinelemeli çağrılardan sonra, tüm dizi doğru şekilde sıralanır.

QED

Karışıklık : Bunun doğru olduğunu nasıl kanıtladığını görmekte bir çok sorunum var. Bu yüzden P (k) 'nin gerçekten tüm doğal sayılar için geçerli olduğunu varsayıyoruz k <n.

Şimdiye kadar gördüğüm indüksiyon kanıtlarının çoğu şuna benzer: Temel durumu kanıtlayın ve P (n) => P (n + 1) olduğunu gösterin. Genellikle bir çeşit cebirsel manipülasyon da içeriyordu. Bu kanıt çok farklı görünüyor ve İndüksiyon kavramının nasıl uygulanacağını anlamıyorum. Partition alt programının doğruluğunun anahtar olması için bir şekilde neden olabilirim. Doğruluğunun sebebi de şöyle: Her yinelemeli çağrının diziyi bir pivot etrafında bölümleyeceğini biliyoruz. Bu pivot daha sonra doğru konumda olacaktır. Daha sonra her alt dizi, bir pivotun etrafında daha fazla bölünecek ve bu pivot daha sonra doğru konumunda olacaktır. Bu, önemsiz bir şekilde sıralanan 1 uzunluğunda bir alt dizi elde edene kadar devam eder.

Ama sonra P (k) 'nin tüm k <n için geçerli olduğunu varsaymıyoruz ... aslında GÖSTERİYORUZ (Bölüm alt programı her zaman bir elemanı doğru pozisyonuna yerleştireceğinden.) (k) tüm k için geçerlidir


"QUE" nedir? Şunu mu demek istediniz: "QED"? ( U için başlayan bir kelime içermeyen Latin Quod Erat Demonstrandum )
Bakuriu

1
Gerçekten QED demek istedim. Sanırım karışıklığım bana "NE?" İspanyolca
FrostyStraw

Yanıtlar:


13

Gerçekten de nin tüm için beklediğini varsayıyoruz . Bu, " , ' yi bildiğimiz kanıt türünün genelleştirilmesidir .k < n P ( n - 1 ) P ( n )P(k)k<nP(n1)P(n)

Açıkladığınız kanıt, güçlü matematiksel tümevarım ilkesi olarak bilinir ve

nin üzerinde tanımlanan bir yüklem olduğunu varsayalım . Bunu gösterebilirsekP(n)n{1,2,}

  1. P(1) doğrudur ve

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

O zaman tamsayıları için doğrudur .n 1P(n)n1

Bahsettiğiniz kanıtta, tam olarak olan budur. boyutundaki bir diziyi sıralamak için quicksort kullanmak için , onu üç parçaya ayırırız : ilk alt dizisi , pivot (doğru yerde olacak) ve boyutunun kalan alt dizisi . Bölüm çalıştığında, ilk alt dizideki her öğe pivottan daha az veya ona eşit olacaktır ve diğer alt dizideki her öğe pivottan daha büyük veya ona eşit olacaktır, bu nedenle ilk ve son alt dizileri yinelemeli olarak sıraladığımızda, tüm diziyi sıraladıktan sonra sarılacaktır.k n - k - 1nknk1

Bunun güçlü indüksiyonla doğru olduğunu gösteriyoruz: ilk alt dizi elemente sahip olduğu için indüksiyon ile doğru sıralanacağını varsayabiliriz. İkinci alt dizide öğeleri bulunduğundan, doğru sıralanacağını varsayabiliriz. Böylece, tüm parçaları bir araya getirerek diziyi sıraladık.n - k - 1 < nk<nnk1<n


2
Güçlü indüksiyon prensibi ile ilgili serin kısım, temel kasanın gerekli olmamasıdır! İndüksiyon adımında alırsak , öncül boştur, bu nedenle koşulsuz olarak . n = 1 k < 1 , P ( k ) P ( 1 )P(1)n=1k<1,P(k)P(1)
Mario Carneiro

Tamam ... açık olmak gerekirse ... P (k) 'nin tüm k <n için doğru olduğunu varsayıyoruz. P (k) ==> P (n) 'nin (tüm k <n için) GÖSTER şeklimiz, milin kesin olarak doğru konumda olacağını bilmenin kombinasyonu ve varsayım (endüktif hipotez) ) sol ve sağ alt dizilerin de sıralandığını gösterir. Bunu temel kasa ile birleştirin (hangi k = 1 <n) ve kanıt tamamlandı?
FrostyStraw

pivotun doğru pozisyonda olduğunu bilmek yeterli olmayacaktı, ama aynı zamanda sağ alt dizinin
pivottan

@FrostyStraw Bu Çinli fısıltılar.
Raphael

1
@FrostyStraw Hehe, kanıtlama stratejisini kastetmiştim. :)
Raphael

7

Bu kanıt tam indüksiyon ilkesini kullanır :

Farz et ki:

  • Temel durum:P(1)
  • Adım: Her , basılı tutarsa ​​( indüksiyon hipotezi ), sonra de tutar.P ( 1 ) , , P ( n - 1 ) P ( n )n>1P(1),,P(n1)P(n)

Sonra tüm tutar .n 1P(n)n1

Bu prensibi, I özelliğini göz önünde bulundurarak normal indüksiyon ilkesini kullanarak kanıtlayabilirsiniz. detayları bırak.

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

Şimdi, aşağıdaki Quicksort sürümünün girdisini doğru bir şekilde sıraladığını kanıtlamak için tam indüksiyon kullanalım:

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

İşte A[1],...,A[n]girdi dizisi ve nuzunluğu. Kanıtlamak istediğimiz ifade şöyledir:

, uzunluk dizisi olsun . Quicksort'u çağırdıktan sonra içeriğini belirtin . Sonra:n 1 A BAn1AB

  1. Quicksort sona erer .A
  2. Bir permütasyon vardır arasında , öyle ki . 1 , , n B [ i ] = A [ π i ]π1,,πn1,,nB[i]=A[πi]
  3. B[1]B[2]B[n] .

Sadece üçüncü mülkü ispat edeceğim, gerisini size bırakıyorum. Bu nedenle nin aşağıdaki ifade olmasına izin verdik :P(n)

Eğer uzunlukta bir dizidir ve ise çalıştırdıktan sonra içeriği , daha sonra .An1BQuicksort(A, n)B[1]B[2]B[n]

Kanıt, üzerinde tam indüksiyon ile . Eğer ise olduğunu varsayalım . Let prosedüründe olduğu gibi olabilir . Yana , indüksiyon hipotezi gösteren Üstelik ve dizilerini oluşturma şeklimizden izler . Böylece Hemen . Böylece tutar.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

Argümanın eksik kısmı '<' nin geçişidir - yani <b ve b <c ise o zaman <c. Son dizinin sıralandığının kanıtı şuna benzer:

A [i], A [j], sıralama sonrası dizinin elemanları olsun; burada i <j. Daha sonra A [i] <A [j], aşağıdaki yerleştirme durumlarından birini izler (ve başka bir durum yoktur):

(a) i ve j birinci bölümde bulunur - A [i] <A [j] bunu tekrarlama / indüksiyon takip eder.

(b) i ve j ikinci bölümdedir - A [i] <A [j] bunu tekrarlama / indüksiyon takip eder.

(c) i birinci bölümdedir ve j, pivotun indeksidir - A [i] <A [j], bölüm prosedürünün kanıtını izler.

(c) i, pivotun indeksidir ve j, ikinci bölümdedir - A [i] <A [j], bölüm prosedürünün kanıtını izler.

(e) i birinci bölümdedir ve j ikinci bölümdedir - daha sonra bölüm prosedürü ile A [i] <pivot ve pivot <A [j]. Dolayısıyla geçişlilik yoluyla A [i] <A [j].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.