พยายามทำความเข้าใจหลักฐานความถูกต้อง Quicksort นี้


10

หลักฐานนี้เป็นหลักฐานโดยการเหนี่ยวนำและไปดังนี้:

P (n) เป็นการยืนยันว่า "Quicksort จัดเรียงอินพุตอาร์เรย์ที่มีความยาว n ได้อย่างถูกต้อง"

เคสพื้นฐาน: อินพุตอาร์เรย์ทุกตัวที่มีความยาว 1 เรียงแล้ว (P (1) ถือ)

ขั้นตอนอุปนัย: แก้ไข n => 2. แก้ไขอาร์เรย์อินพุตที่มีความยาว n

ต้องแสดง: ถ้า P (k) ถือสำหรับ k <n ทั้งหมดดังนั้น P (n) ก็ถือเช่นกัน

จากนั้นเขาก็ดึงอาร์เรย์ A ที่แบ่งพาร์ติชันไว้รอบ pivot p ดังนั้นเขาจึงวาด p และเรียกส่วนของอาร์เรย์ที่ <p เป็นส่วนที่ 1 และส่วนที่> p คือส่วนที่สอง ความยาวของส่วนที่ 1 = k1 และความยาวของส่วนที่ 2 คือ k2 โดยการพิสูจน์ความถูกต้องของรูทีนย่อย Partition (พิสูจน์แล้วก่อนหน้านี้) pivot p จะหมุนขึ้นในตำแหน่งที่ถูกต้อง

ป้อนคำอธิบายรูปภาพที่นี่

โดยสมมติฐานอุปนัย: 1, ส่วนที่ 2 ได้รับการจัดเรียงอย่างถูกต้องโดยการโทรซ้ำ (ใช้ P (K1), P (k2))

ดังนั้น: หลังจากเรียกซ้ำ, อาร์เรย์ทั้งหมดจะถูกจัดเรียงอย่างถูกต้อง

QED

ความสับสนของฉัน : ฉันมีปัญหามากมายที่เห็นว่าวิธีนี้พิสูจน์ความถูกต้องของมัน ดังนั้นเราจึงสันนิษฐานว่า P (k) มีค่าเป็นจำนวนธรรมชาติทั้งหมด k <n

หลักฐานการเหนี่ยวนำส่วนใหญ่ที่ฉันได้เห็นไปเป็นเช่น: พิสูจน์กรณีฐานและแสดงให้เห็นว่า P (n) => P (n + 1) พวกเขามักจะเกี่ยวข้องกับการเรียงพีชคณิต หลักฐานนี้ดูแตกต่างกันมากและฉันไม่เข้าใจวิธีการใช้แนวคิดของการเหนี่ยวนำกับมัน ฉันสามารถเหตุผลได้ว่าความถูกต้องของรูทีนย่อย Partition เป็นกุญแจสำคัญ ดังนั้นเหตุผลสำหรับความถูกต้องของมันเป็นดังนี้: เรารู้ว่าการเรียกซ้ำแต่ละครั้งก็จะแบ่งอาร์เรย์รอบเดือย เดือยนี้จะอยู่ในตำแหน่งที่ถูกต้อง จากนั้นแต่ละ subarray จะถูกแบ่งพาร์ติชันเพิ่มเติมรอบ ๆ เดือยและเดือยนั้นจะอยู่ในตำแหน่งที่ถูกต้อง สิ่งนี้จะดำเนินต่อไปเรื่อย ๆ จนกว่าคุณจะได้รับ subarray ที่มีความยาว 1 ซึ่งเรียงลำดับเล็กน้อย

แต่แล้วเราก็ไม่ได้สมมติว่า P (k) ถือเอาไว้สำหรับ k <n ทั้งหมด .... เรากำลังแสดงให้เห็นว่ามันเป็นจริง (เนื่องจากรูทีนย่อยพาร์ติชันจะวางองค์ประกอบหนึ่งในตำแหน่งที่ถูกต้องเสมอ) เราไม่ได้สมมติว่า P (k) ถือสำหรับ k ทั้งหมด


"QUE" คืออะไร คุณหมายถึง "QED" หรือไม่ (Latin Quod Erat Demonstrandumซึ่งไม่มีคำใด ๆ ที่เริ่มต้นสำหรับU )
Bakuriu

1
จริง ๆ แล้วฉันหมายถึง QED ฉันเดาว่าความสับสนของฉันทำให้ฉันเขียนว่า "อะไร" ในภาษาสเปน
FrostyStraw

คำตอบ:


13

เราเป็นจริงสมมติว่าถือสำหรับทุก<n นี่เป็นลักษณะทั่วไปของ "จากเราพิสูจน์รูปแบบการพิสูจน์ " ที่คุณคุ้นเคยP(k)k<nP(n1)P(n)

หลักฐานที่คุณอธิบายเรียกว่าหลักการของการอุปนัยทางคณิตศาสตร์ที่แข็งแกร่งและมีรูปแบบ

สมมติว่าเป็นคำกริยาที่กำหนดไว้ใน\} ถ้าเราสามารถแสดงให้เห็นว่าP(n)n{1,2,}

  1. P(1)เป็นจริงและ

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

แล้วเป็นจริงสำหรับทุกจำนวนเต็ม1P(n)n1

ในหลักฐานที่คุณอ้างอิงนั่นคือสิ่งที่เกิดขึ้น ที่จะใช้ในการจัดเรียง quicksort อาร์เรย์ของขนาดเราพาร์ทิชันมันเป็นสามชิ้น: ครั้งแรก subarray, เดือย (ซึ่งจะอยู่ในสถานที่ที่ถูกต้อง) และ subarray เหลือขนาดNK-1โดยวิธีการทำงานของพาร์ทิชันทุกองค์ประกอบใน subarray แรกจะน้อยกว่าหรือเท่ากับ pivot และทุกองค์ประกอบใน subarray อื่นจะมากกว่าหรือเท่ากับ pivot ดังนั้นเมื่อเราเรียงลำดับ subarray แรกและสุดท้ายซ้ำ จะจบลงเมื่อมีการเรียงลำดับอาร์เรย์ทั้งหมดnknk1

เราแสดงให้เห็นว่าสิ่งนี้ถูกต้องโดยการเหนี่ยวนำที่แข็งแกร่ง: เนื่องจาก subarray แรกมีองค์ประกอบเราสามารถสันนิษฐานได้โดยการเหนี่ยวนำว่ามันจะถูกจัดเรียงอย่างถูกต้อง เนื่องจากระบบย่อยที่สองมีองค์ประกอบเราสามารถสันนิษฐานได้ว่ามันจะถูกจัดเรียงอย่างถูกต้อง ดังนั้นเมื่อนำชิ้นส่วนทั้งหมดเข้าด้วยกันเราจะจบลงด้วยการจัดเรียงแถวลำดับ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

โอเค ... เพื่อให้ชัดเจน ... เราสันนิษฐานว่า P (k) เป็นจริงสำหรับทุก k <n และวิธีที่เราแสดงให้เห็นว่า P (k) ==> P (n) (สำหรับ k <n ทั้งหมด) คือการรวมกันของการรู้ว่าเดือยจะอยู่ในตำแหน่งที่ถูกต้องและผ่านสมมติฐาน (สมมติฐานอุปนัย ) ที่ subarrays ซ้ายและขวาจะถูกจัดเรียงเช่นกัน รวมกับเคสตัวฐาน (ที่ k = 1 <n) และการพิสูจน์เสร็จสมบูรณ์หรือไม่
FrostyStraw

ดีฉันเดาว่ามันคงไม่พอที่จะรู้ว่าเดือยอยู่ในตำแหน่งที่ถูกต้อง แต่ยังรวมถึง subarray ที่ถูกต้องนั้นใหญ่กว่า pivot และอันที่เหลืออยู่นั้นน้อยกว่า
FrostyStraw

@FrostyStraw มันเป็นเสียงกระซิบจีน
Raphael

1
@ FrostyStraw Hehe ฉันหมายถึงกลยุทธ์การพิสูจน์ :)
Raphael

7

หลักฐานนี้ใช้หลักการของการเหนี่ยวนำที่สมบูรณ์ :

สมมติว่า:

  • เคสฐาน:P(1)
  • ขั้นตอน: สำหรับทุก ๆถ้าพัก ( สมมติฐานการเหนี่ยวนำ ) จากนั้นถือเช่นกันn>1P(1),,P(n1)P(n)

จากนั้นจะถือครองสำหรับทั้งหมดP(n)n1

คุณสามารถพิสูจน์หลักการนี้โดยใช้หลักการการเหนี่ยวนำตามปกติโดยพิจารณาคุณสมบัติ I ปล่อยให้คุณรายละเอียด

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คือความยาว ข้อความที่เราต้องการพิสูจน์มีดังนี้:

ให้เป็นอาร์เรย์ของความยาว1 แสดงว่าเนื้อหาของหลังจากเรียก Quicksort โดยBแล้ว:An1AB

  1. quicksort ยุติในA
  2. มีการเปลี่ยนแปลงของดังกล่าวว่าpi_i]π1,,πn1,,nB[i]=A[πi]
  3. B[1]B[2]B[n][N]

ฉันจะพิสูจน์คุณสมบัติที่สามโดยทิ้งที่เหลือให้คุณ เราปล่อยให้เป็นข้อความต่อไปนี้:P(n)

หากเป็นอาร์เรย์ของความยาวและเป็นเนื้อหาของมันหลังจากใช้แล้ว[N]An1BQuicksort(A, n)B[1]B[2]B[n]

หลักฐานอยู่โดยการเหนี่ยวนำที่สมบูรณ์แบบบนnถ้าแล้วมีอะไรที่จะพิสูจน์ดังนั้นสมมติว่า1 Letจะเป็นในขั้นตอน ตั้งแต่ , สมมติฐานการปฐมนิเทศแสดงให้เห็นว่า นอกจากนี้จากวิธีที่เราจัดตั้งอาร์เรย์และมันตามที่[1] ดังนั้น มันดังต่อไปทันทีว่า[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 ( n )B[1]B[n]P(n)

4

ส่วนที่ขาดหายไปของการโต้เถียงคือความแปรปรวนของ '<' - คือคุณสมบัติที่ถ้า <b และ b <c ดังนั้น a <c หลักฐานว่าอาร์เรย์สุดท้ายถูกเรียงลำดับแล้วจะเป็นดังนี้:

ให้ A [i], A [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 คือดัชนีของ pivot และ j อยู่ในพาร์ติชั่นที่สอง - A [i] <A [j] ตามด้วยการพิสูจน์ขั้นตอนการแบ่งพาร์ติชัน

(e) i อยู่ในพาร์ติชั่นแรกและ j อยู่ในพาร์ติชั่นที่สอง - จากนั้นโดยโพรซีเดอร์พาร์ติชัน, A [i] <pivot, และ pivot <A [j] ดังนั้นโดยความไวแสง A [i] <A [j]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.