Tentando entender esta prova de correção do Quicksort


10

Essa prova é uma prova por indução e é a seguinte:

P (n) é a asserção de que "o Quicksort classifica corretamente todas as matrizes de comprimento n".

Caso base: toda matriz de entrada de comprimento 1 já está classificada (P (1) é válida)

Etapa indutiva: corrija n => 2. Corrija uma matriz de entrada de comprimento n.

Precisa mostrar: se P (k) vale para todos os k <n, então P (n) vale também

Ele então desenha uma matriz A particionada em torno de algum pivô p. Então ele desenha p e chama a parte da matriz que é <p como a 1ª parte, e a parte que é> p é a segunda parte. O comprimento da parte 1 = k1 e o comprimento da parte 2 é k2. Pela prova de exatidão da sub-rotina Partition (comprovada anteriormente), o pivô p termina na posição correta.

insira a descrição da imagem aqui

Por hipótese indutiva: 1ª e 2ª partes são classificadas corretamente por chamadas recursivas. (Usando P (K1), P (k2))

Assim: após chamadas recursivas, toda a matriz é classificada corretamente.

QED

Minha confusão : tenho muitos problemas para ver exatamente como isso prova a exatidão. Portanto, assumimos que P (k) de fato se aplica a todos os números naturais k <n.

A maioria das provas de indução que eu vi até agora são algo como: Prove o caso base e mostre que P (n) => P (n + 1). Eles geralmente também envolviam algum tipo de manipulação algébrica. Essa prova parece muito diferente e não entendo como aplicar o conceito de indução a ela. Eu posso, de certa forma, raciocinar que a correção da sub-rotina Partition é a chave. O mesmo ocorre com o raciocínio de sua correção, como se segue: Sabemos que, a cada chamada recursiva, ele particionará a matriz em torno de um pivô. Esse pivô estará em sua posição correta. Em seguida, cada subarray será particionado em torno de um pivô, e esse pivô estará em sua posição correta. Isso continua até você obter uma sub-matriz de comprimento 1, que é ordenada trivialmente.

Mas então não estamos assumindo que P (k) é válido para todos os k <n .... na verdade estamos MOSTRANDO isso (uma vez que a sub-rotina Partition sempre colocará um elemento em sua posição correta.) Não estamos assumindo que P (k) vale para todos os k


O que é o "QUE"? Você quis dizer "QED"? (do latim demonstrandum do erat quod que não contém qualquer palavra que começa por U )
Bakuriu

11
Eu realmente quis dizer QED. Eu acho que minha confusão me levou a escrever "O QUE?" em espanhol
FrostyStraw 20/09/16

Respostas:


13

Na verdade, estamos assumindo que é válido para todos os k < n . Esta é uma generalização do estilo de prova "De P ( n - 1 ) , provamos P ( n ) " que você está familiarizado.P(k)k<nP(n1)P(n)

A prova que você descreve é ​​conhecida como o princípio da forte indução matemática e tem a forma

Suponha que seja um predicado definido em n { 1 , 2 , } . Se podemos mostrar queP(n)n{1,2,}

  1. é verdadeiro eP(1)

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

Então é verdadeiro para todos os números inteiros n 1 .P(n)n1

nknk1

k<nnk1<n


2
P(1)n=1k<1,P(k)P(1)

Ok, então ... para ser claro ... ASSUMIRAM que P (k) é verdadeiro para todos os k <n. E a maneira como mostramos que P (k) ==> P (n) (para todos k <n) é através da combinação de saber que o pivô com certeza estará em sua posição correta e através da suposição (a hipótese indutiva) ) que as sub-matrizes esquerda e direita também são classificadas. Combine isso com o caso base (em que k = 1 <n) e a prova está completa?
FrostyStraw 20/09/16

bem, eu acho que não seria suficiente para saber que o pivô está na posição correta, mas também que o subarray direita é tudo maior do que o pivô e o esquerdo é tudo menos de
FrostyStraw

@FrostyStraw São sussurros chineses.
Raphael

11
@FrostyStraw Hehe, eu quis dizer a estratégia de prova. :)
Raphael

7

Esta prova usa o princípio da indução completa :

Suponha que:

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

P(n)n1

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

Agora, vamos usar a indução completa para provar que a seguinte versão do Quicksort classifica sua entrada corretamente:

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

Aqui A[1],...,A[n]está a matriz de entrada e nseu comprimento. A afirmação que queremos provar é a seguinte:

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 parte que falta do argumento é transitividade de '<' - ou seja, a propriedade que, se a <be b <c, então a <c. A prova de que a matriz final é classificada é mais ou menos assim:

Seja A [i], A [j] elementos da matriz pós-ordenada, onde i <j. Então A [i] <A [j] segue um dos seguintes casos de posicionamento (e não há outros casos):

(a) iej estão na primeira partição - A [i] <A [j] segue por recursão / indução.

(b) iej estão na segunda partição - A [i] <A [j] segue por recursão / indução.

(c) i está na primeira partição e j é o índice do pivô - A [i] <A [j] segue pela prova do procedimento de partição.

(c) i é o índice do pivô e j está na segunda partição - A [i] <A [j] segue pela prova do procedimento de partição.

(e) i está na primeira partição ej está na segunda partição - depois pelo procedimento de partição, A [i] <pivô e pivô <A [j]. Então, por transitividade, A [i] <A [j].

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.