Tratando de entender esta prueba de corrección de Quicksort


10

Esta prueba es una prueba por inducción, y es la siguiente:

P (n) es la afirmación de que "Quicksort ordena correctamente cada matriz de entrada de longitud n".

Caso base: cada matriz de entrada de longitud 1 ya está ordenada (P (1) se mantiene)

Paso inductivo: arreglo n => 2. Arregle alguna matriz de entrada de longitud n.

Es necesario mostrar: si P (k) se cumple para todos los k <n, entonces P (n) también se cumple

Luego dibuja una matriz A dividida alrededor de algún pivote p. Entonces dibuja p, y llama a la parte de la matriz que es <p como la primera parte, y la parte que es> p es la segunda parte. La longitud de la parte 1 = k1, y la longitud de la parte 2 es k2. Mediante la prueba de corrección de la subrutina de Partición (probada anteriormente), el pivote p termina en la posición correcta.

ingrese la descripción de la imagen aquí

Por hipótesis inductiva: la primera, segunda parte se ordenan correctamente por llamadas recursivas. (Usando P (K1), P (k2))

Entonces: después de las llamadas recursivas, toda la matriz está ordenada correctamente.

QED

Mi confusión : tengo muchos problemas para ver exactamente cómo esto demuestra la corrección de la misma. Por lo tanto, suponemos que P (k) se cumple para todos los números naturales k <n.

La mayoría de las pruebas de inducción que he visto hasta ahora son algo así como: demostrar el caso base y mostrar que P (n) => P (n + 1). Por lo general, también involucraban algún tipo de manipulación algebraica. Esta prueba parece muy diferente, y no entiendo cómo aplicarle el concepto de inducción. De alguna manera puedo razonar que la corrección de la subrutina de Partición es la clave. Así es el razonamiento para su corrección de la siguiente manera: Sabemos que cada llamada recursiva dividirá la matriz alrededor de un pivote. Este pivote estará en su posición correcta. Luego, cada subconjunto se dividirá más alrededor de un pivote, y ese pivote estará en su posición correcta. Esto sigue y sigue hasta que obtiene un subconjunto de longitud 1, que se ordena trivialmente.

Pero entonces no estamos asumiendo que P (k) se cumple para todos los k <n ... en realidad estamos MOSTRANDO que sí (ya que la subrutina Partición siempre colocará un elemento en su posición correcta). ¿No estamos asumiendo que P (k) se cumple para todos los k


¿Qué es "QUE"? ¿Quiso decir "QED"? (el Demostrandum en latín Quod Erat que no contiene ninguna palabra que comience por U )
Bakuriu

1
De hecho, me refería a QED. Supongo que mi confusión me llevó a escribir "¿QUÉ?" en español
FrostyStraw

Respuestas:


13

De hecho, estamos asumiendo que cumple para todos los . Esta es una generalización del estilo de prueba "De , demostramos " con el que está familiarizado.P(k)k<nP(n1)P(n)

La prueba que describe se conoce como el principio de la inducción matemática fuerte y tiene la forma

Suponga que es un predicado definido en . Si podemos demostrar esoP(n)n{1,2,}

  1. P(1) es cierto, y

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

Entonces es verdadero para todos los enteros .P(n)n1

En la prueba a la que te refieres, eso es exactamente lo que está sucediendo. Para usar el ordenamiento rápido para ordenar una matriz de tamaño , la dividimos en tres partes: la primera submatriz, el pivote (que estará en su lugar correcto) y la submatriz restante de tamaño . Por cierto, la partición funciona, cada elemento en el primer subconjunto será menor o igual que el pivote y cada elemento en el otro subconjunto será mayor o igual que el pivote, por lo que cuando clasificamos recursivamente el primer y último subconjunto, terminará habiendo ordenado toda la matriz.nknk1

Mostramos que esto es correcto por inducción fuerte: dado que el primer subconjunto tiene elementos, podemos suponer por inducción que se ordenará correctamente. Dado que el segundo subconjunto tiene elementos , podemos suponer que se ordenará correctamente. Por lo tanto, al unir todas las piezas, terminaremos de haber ordenado la matriz.k<nnk1<n


2
¡Lo bueno del principio de la inducción fuerte es que el caso base no es necesario! Si tomamos en el paso de inducción, entonces el antecedente es vacío, por lo que tenemos incondicionalmente. P(1)n=1k<1,P(k)P(1)
Mario Carneiro

Bien, para ser claros ... ASUMIMOS P (k) es cierto para todos los k <n. Y la forma en que MOSTRAMOS que P (k) ==> P (n) (para todos los k <n) es a través de la combinación de saber que el pivote seguramente estará en su posición correcta, y a través del supuesto (la hipótesis inductiva ) que las submatrices izquierda y derecha también están ordenadas. Combina eso con el caso base (en el cual k = 1 <n), y la prueba está completa?
FrostyStraw

bueno, supongo que no sería suficiente saber que el pivote está en su posición correcta, sino también que el subconjunto derecho es más grande que el pivote y el izquierdo es menor que
FrostyStraw

@FrostyStraw Son susurros chinos.
Raphael

1
@FrostyStraw Hehe, me refería a la estrategia de prueba. :)
Raphael

7

Esta prueba utiliza el principio de inducción completa :

Suponer que:

  • Caso base:P(1)
  • Paso: Por cada , si mantienen ( hipótesis de inducción ), entonces también se cumple.n>1P(1),,P(n1)P(n)

Entonces cumple para todos .P(n)n1

Puede probar este principio utilizando el principio de inducción habitual considerando la propiedad I te dejo los detalles.

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

Ahora, usemos la inducción completa para demostrar que la siguiente versión de Quicksort ordena su entrada correctamente:

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

Aquí A[1],...,A[n]está la matriz de entrada, y nes su longitud. La declaración que queremos demostrar es la siguiente:

Sea una matriz de longitud . Denotar el contenido de después de llamar a la ordenación rápida por . Luego:An1AB

  1. Quicksort termina en .A
  2. Hay una permutación de tal que .π1,,πn1,,nB[i]=A[πi]
  3. B[1]B[2]B[n] .

Solo probaré la tercera propiedad, dejando el resto a usted. Así, dejamos que sea ​​la siguiente declaración:P(n)

Si es una matriz de longitud , y es su contenido después de la ejecución , entonces .An1BQuicksort(A, n)B[1]B[2]B[n]

La prueba es por inducción completa en . Si entonces no hay nada que demostrar, así que supongamos que . Deje ser como en el procedimiento . Dado que , la hipótesis de inducción muestra que Además, por la forma en que formamos las matrices e , se deduce que . Así Se deduce inmediatamente que . Por lo tanto, cumple.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

La parte que falta del argumento es la transitividad de '<' , es decir, la propiedad de que si a <by b <c, entonces a <c. La prueba de que la matriz final está ordenada es algo como esto:

Supongamos que A [i], A [j] son ​​elementos de la matriz de clasificación posterior, donde i <j. Entonces A [i] <A [j] se deduce de uno de los siguientes casos de ubicación (y no hay otros casos):

(a) i y j están en la primera partición - A [i] <A [j] sigue por recursión / inducción.

(b) i y j están en la segunda partición - A [i] <A [j] sigue por recursión / inducción.

(c) i está en la primera partición y j es el índice del pivote - A [i] <A [j] sigue como prueba del procedimiento de partición.

(c) i es el índice del pivote y j está en la segunda partición - A [i] <A [j] sigue como prueba del procedimiento de partición.

(e) i está en la primera partición y j está en la segunda partición; luego, mediante el procedimiento de partición, A [i] <pivote y pivote <A [j]. Entonces, por transitividad, A [i] <A [j].

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.