Essayer de comprendre cette preuve d'exactitude Quicksort

10

Cette preuve est une preuve par induction, et va comme suit:

P (n) est l'affirmation selon laquelle "Tri rapide trie correctement chaque tableau d'entrée de longueur n".

Cas de base: chaque tableau d'entrée de longueur 1 est déjà trié (P (1) tient)

Étape inductive: fixer n => 2. Fixer un tableau d'entrée de longueur n.

Besoin de montrer: si P (k) est valable pour tout k <n, alors P (n) est également valable

Il trace ensuite un tableau A partitionné autour d'un pivot p. Il dessine donc p et appelle la partie du tableau qui est <p comme 1ère partie, et la partie qui est> p est la deuxième partie. La longueur de la partie 1 = k1, et la longueur de la partie 2 est k2. Par la preuve d'exactitude du sous-programme de partition (prouvée précédemment), le pivot p se termine dans la bonne position.

entrez la description de l'image ici

Par hypothèse inductive: les 1ère, 2e parties sont triées correctement par appels récursifs. (En utilisant P (K1), P (k2))

Donc: après des appels récursifs, tout le tableau est correctement trié.

QED

Ma confusion : j'ai beaucoup de mal à voir exactement comment cela prouve l'exactitude de celui-ci. Nous supposons donc que P (k) est vrai pour tous les nombres naturels k <n.

La plupart des preuves d'induction que j'avais vues jusqu'à présent vont quelque chose comme: Prouver le cas de base et montrer que P (n) => P (n + 1). Ils impliquaient généralement une sorte de manipulation algébrique. Cette preuve semble très différente, et je ne comprends pas comment lui appliquer le concept d'Induction. Je peux quelque peu raisonner que l'exactitude du sous-programme de partition est la clé. Le raisonnement pour son exactitude est le suivant: Nous savons que chaque appel récursif, il partitionnera le tableau autour d'un pivot. Ce pivot sera alors dans sa position légitime. Ensuite, chaque sous-réseau sera encore partitionné autour d'un pivot, et ce pivot sera alors dans sa position légitime. Cela continue indéfiniment jusqu'à ce que vous obteniez un sous-tableau de longueur 1, qui est trié de manière triviale.

Mais alors nous ne supposons pas que P (k) est valable pour tous les k <n .... nous le montrons réellement (puisque le sous-programme de partition placera toujours un élément dans sa position légitime.) Ne supposons-nous pas que P (k) est valable pour tout k

FrostyStraw
la source
Qu'est-ce que "QUE"? Voulez-vous dire "QED"? (le latin Quod Erat Demonstrandum qui ne contient aucun mot commençant par U )
Bakuriu
1
Je voulais bien dire QED. Je suppose que ma confusion m'a amené à écrire "QUOI?" en espagnol
FrostyStraw

Réponses:

13

P(k)k<nP(n1)P(n)

La preuve que vous décrivez est connue comme le principe d'une forte induction mathématique et a la forme

P(n)n{1,2,}

  1. P(1)

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

P(n)n1

nknk1

k<nnk1<n

Rick Decker
la source
2
P(1)n=1k<1,P(k)P(1)
Bon alors ... pour être clair ... Nous supposons que P (k) est vrai pour tout k <n. Et la façon dont nous MONTRONS que P (k) ==> P (n) (pour tout k <n) est par la combinaison de savoir que le pivot sera à coup sûr dans sa position correcte, et par l'hypothèse (l'hypothèse inductive ) que les sous-réseaux gauche et droit sont également triés. Combinez cela avec le cas de base (dans lequel k = 1 <n), et la preuve est complète?
FrostyStraw
eh bien je suppose que ce ne serait pas suffisant de savoir que le pivot est dans sa position correcte, mais aussi que le sous-tableau de droite est tout plus grand que le pivot et que celui de gauche est tout moins que
FrostyStraw
@FrostyStraw Ce sont des chuchotements chinois.
Raphael
1
@FrostyStraw Hehe, je voulais dire la stratégie de preuve. :)
Raphael
7

Cette preuve utilise le principe de l' induction complète :

Supposer que:

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

P(n)n1

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

Maintenant, utilisons l'induction complète pour prouver que la version suivante de Quicksort trie correctement son entrée:

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

Voici A[1],...,A[n]le tableau d'entrée et nsa longueur. La déclaration que nous voulons prouver est la suivante:

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)
Yuval Filmus
la source
4

La partie manquante de l'argument est la transitivité de '<' - c'est-à-dire la propriété que si a <b et b <c, alors a <c. La preuve que le tableau final est trié ressemble à ceci:

Soit A [i], A [j] des éléments du tableau post-tri, où i <j. Alors A [i] <A [j] découle de l'un des cas de placement suivants (et il n'y a pas d'autres cas):

(a) i et j sont dans la première partition - A [i] <A [j] suit par récursivité / induction.

(b) i et j sont dans la deuxième partition - A [i] <A [j] suit par récursivité / induction.

(c) i est dans la première partition et j est l'indice du pivot - A [i] <A [j] suit la procédure de preuve de partition.

(c) i est l'indice du pivot et j est dans la deuxième partition - A [i] <A [j] suit la procédure de preuve de partition.

(e) i est dans la première partition et j est dans la deuxième partition - puis par la procédure de partition, A [i] <pivot et pivot <A [j]. Donc par transitivité, A [i] <A [j].

PMar
la source