이 Quicksort 정확성 증명을 이해하려고


10

이 증거는 귀납에 의한 증거이며 다음과 같습니다.

P (n)은 "Quicksort가 길이 n의 모든 입력 배열을 올바르게 정렬합니다"라는 주장입니다.

기본 사례 : 길이가 1 인 모든 입력 배열이 이미 정렬되었습니다 (P (1) 보유)

유도 단계 : 고정 n => 2. 길이 n의 일부 입력 배열을 고정합니다.

P (k)가 모든 k <n을 유지하면 P (n)도 유지됩니다.

그런 다음 피벗 p 주위에 분할 된 배열 A를 그립니다. 따라서 p를 그리고 첫 번째 부분으로 <p 인 배열 부분을 호출하고> p 인 부분을 두 번째 부분으로 호출합니다. 파트 1의 길이는 k1이고 파트 2의 길이는 k2입니다. Partition 서브 루틴 (앞에서 증명)의 정확성 증명으로 피벗 p가 올바른 위치로 감 깁니다.

여기에 이미지 설명을 입력하십시오

귀납적 가설을 통해 : 1 차, 2 차 부품은 재귀 호출에 의해 올바르게 정렬됩니다. (P (K1), P (k2) 사용)

따라서 재귀 호출 후 전체 배열이 올바르게 정렬됩니다.

QED

내 혼란 : 나는 이것이 어떻게 그것이 정확성을 증명하는지 정확하게 보는 데 많은 문제가 있습니다. 따라서 우리는 실제로 모든 자연수 k <n에 대해 P (k)를 유지한다고 가정합니다.

내가 지금까지 본 대부분의 유도 증명은 다음과 같습니다. 기본 사례를 증명하고 P (n) => P (n + 1). 그들은 일반적으로 일종의 대수 조작을 포함했습니다. 이 증거는 매우 다른 것처럼 보이며 유도 개념을 적용하는 방법을 이해하지 못합니다. 파티션 서브 루틴의 정확성이 핵심이라고 다소 추론 할 수 있습니다. 정확성에 대한 추론은 다음과 같습니다. 우리는 각 재귀 호출이 배열을 피벗 주위로 분할한다는 것을 알고 있습니다. 이 피벗은 올바른 위치에있게됩니다. 그러면 각 하위 배열이 피벗 주위로 더 분할되고 해당 피벗이 올바른 위치에있게됩니다. 이것은 길이 1의 하위 배열을 얻을 때까지 계속 진행됩니다.

그러나 우리는 P (k)가 모든 k <n ...을 보유한다고 가정하지 않습니다. 우리는 실제로 그것을 보여줍니다 (파티션 서브 루틴은 항상 하나의 요소를 올바른 위치에 배치하기 때문에) P를 가정하지 않습니다 (k) 모든 k에 대해 보유


"QUE"는 무엇입니까? "QED"를 의미 했습니까? ( U로 시작하는 단어가 포함되어 있지 않은 Latin Quod Erat Demonstrandum )
Bakuriu

1
나는 실제로 QED를 의미했다. 혼란 때문에 "WHAT?"라고 작성되었습니다. 스페인어로
FrostyStraw

답변:


13

우리는 실제로 모든 k < n에 대해 유지를 가정 합니다. 이것은 "From P ( n - 1 ) , 우리는 당신이 잘 알고있는 P ( n ) "스타일의 증명을 일반화 한 것입니다.(케이)케이<(1)()

당신이 설명하는 증거의 원칙으로 알려져 강력한 수학적 귀납법 과 양식을 가지고

한다고 가정 술어에 정의 N { 1 , 2 , ... } . 우리가 보여줄 수 있다면(){1,2,}

  1. 은 사실이며(1)

  2. (케이<[(케이)])()

그러면 모든 정수 n 1에 대해 가 적용됩니다 .()1

당신이 참조하는 증거에서, 그것은 정확히 무슨 일인지입니다. quicksort를 사용하여 크기 의 배열을 정렬하려면 첫 번째 k 하위 배열, 피벗 (정확한 위치에 있음) 및 나머지 n - k - 1 크기의 하위 배열 로 세 부분으로 분할합니다 . 파티션이 작동하는 방식에 따라 첫 번째 하위 배열의 모든 요소는 피벗보다 작거나 같고 다른 하위 배열의 모든 요소는 피벗보다 크거나 같습니다. 따라서 첫 번째 및 마지막 하위 배열을 재귀 적으로 정렬하면 전체 배열을 정렬하면 종료됩니다.케이케이1

우리는 이것이 강한 유도에 의해 올바른 것을 보여줍니다 : 첫 번째 서브 어레이는 요소를 가지기 때문에, 그것이 올바르게 정렬 될 것이라고 가정 할 수 있습니다. 두 번째 하위 배열에는 n - k - 1 < n 개의 요소가 있으므로 올바르게 정렬된다고 가정 할 수 있습니다. 따라서 모든 조각을 모두 모으면 배열을 정렬하여 감을 것입니다.케이<케이1<


2
강력한 유도 원리에 대한 멋진 부분은베이스 케이스 가 필요하지 않다는 것입니다! 유도 단계에서 n = 1 을 취 하면 선행 k < 1 이고 P ( k ) 가 비어 있으므로 P ( 1 )이 무조건적입니다. (1)=1케이<1,(케이)(1)
마리오 카네이로

자 ... 명확히 말하면 ... 우리는 모든 k <n에 대해 P P (k)를 가정합니다. 그리고 우리가 P (k) ==> P (n) (모든 k <n에 대해)를 표시하는 방법은 피벗이 반드시 올바른 위치에 있고 가정 (유도 가설)을 통해 알 수 있다는 것입니다. ) 왼쪽 및 오른쪽 하위 배열도 정렬됩니다. 이것을 기본 케이스 (k = 1 <n)와 결합하면 증거가 완성됩니까?
FrostyStraw

글쎄, 나는 피봇이 올바른 위치에 있다는 것을 아는 것만으로는 충분하지 않지만 오른쪽 서브 어레이는 피벗보다 크고 왼쪽은 모두 피봇보다 작다.
FrostyStraw

@FrostyStraw 그것은 중국의 속삭임입니다.
Raphael

1
@FrostyStraw Hehe, 나는 증명 전략을 의미했다. :)
라파엘

7

이 증거는 완전한 유도 원리를 사용합니다 .

한다고 가정:

  • 베이스 케이스 : (1)
  • 단계 : 모든 , P ( 1 ) , , P ( n - 1 )이 유지 ( 유도 가설 )이면 P ( n ) 도 유지됩니다.>1(1),,(1)()

그러면 모두 보유 N 1 .()1

당신은 속성 고려하여 일반적인 유도 원리를 사용하여이 원리를 증명할 수있는 나는 당신에게 세부 사항을두고 있습니다.

(미디엄)(1) 과 (2) 과  과 (미디엄)

이제 완전한 인덕션을 사용하여 다음 버전의 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그것의 길이이다. 우리가 증명하고 싶은 진술은 다음과 같습니다.

하자 길이의 배열 N 1 . B로 Quicksort를 호출 A 의 내용을 나타냅니다 . 그때:1

  1. 빠른 정렬은 종료됩니다 .
  2. 순열이 존재 1 , ... , N 이되도록 B [ I ] = [ π I ] .π1,,π1,,[나는]=[π나는]
  3. .[1][2][]

()

1Quicksort(A, n)[1][2][]

=1>1엑스,엑스,와이,와이Quicksort엑스,와이<

엑스[1]엑스[2]엑스[엑스]와이[1]와이[2]와이[와이]
엑스와이엑스[엑스][1]<와이[1]
엑스[1]엑스[엑스][1]<와이[1]와이[와이].
[1][]()

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]입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.