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.
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
fonte
Respostas:
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<n P(n−1) P(n)
A prova que você descreve é conhecida como o princípio da forte indução matemática e tem a forma
fonte
Esta prova usa o princípio da indução completa :
Agora, vamos usar a indução completa para provar que a seguinte versão do Quicksort classifica sua entrada corretamente:
Aqui
A[1],...,A[n]
está a matriz de entrada en
seu comprimento. A afirmação que queremos provar é a seguinte:Quicksort
fonte
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].
fonte