Saltar al contenido principal

Mediana de un arreglo

Encontrar la mediana zz de un arreglo A[1,n]A[1,n] (con nn impar) es un problema para el cual no se conoce el número exacto de comparaciones. Se conoce una cota inferior de (2+250)n(2+2^{-50})n y una cota superior de 2.95n2.95 n. Mostraremos una cota inferior relativamente sencilla de 3(n1)2\frac{3(n-1)}{2} comparaciones. Hablaremos de la mediana zz que entregará el algoritmo aunque éste no la conozca hasta el final.

Consideraremos dos tipos de comparaciones, cruciales y no cruciales. Conceptualmente, una comparación resulta crucial para un elemento xx si es la que nos permite conocer la relación entre xx y zz. Más precisamente, consideremos la historia de las comparaciones que realizó el algoritmo para determinar zz, y definamos un grafo con un nodo por elemento. Dibujemos una arista entre zz y los elementos xx que se compararon directamente contra zz, roja si x>zx > z y azul si x<zx < z. También pintemos a xx de rojo o azul, respectivamente. Para todo nodo rojo xx, dibujemos aristas rojas hacia elementos y>xy > x que aún no tengan color y se hayan comparado directamente contra xx. Para todo nodo azul xx, dibujemos aristas azules hacia elementos y<xy < x que aún no tengan color y se hayan comparado directamente contra xx. En ambos casos, pintemos a yy de rojo o azul, respectivamente. Continuemos así hasta pintar todas las aristas y elementos posibles. Todas las aristas pintadas corresponden a las comparaciones cruciales.

Cota inferior mediana

El grafo formado por las aristas rojas y azules no tiene ciclos. Si no resulta conexo, el algoritmo no puede conocer la mediana, pues implica que existe un elemento xx no pintado, por lo cual el algoritmo nunca hizo una comparación que le permitiera determinar si x<zx < z ó x>zx > z. El adversario puede entonces decidir si x<zx < z ó x>zx > z, haciendo que la respuesta zz sea incorrecta. Por lo tanto, se necesitan al menos n1n-1 comparaciones cruciales.

Mostraremos que, además, el algoritmo debe haber realizado al menos n12\frac{n-1}{2} comparaciones no cruciales, cuyas aristas no están en el grafo porque resultan ser x<yx < y para un y>zy > z, o bien x>yx > y para un y<zy < z. Para esto, consideremos un adversario que responde a las comparaciones del algoritmo mediante asignarles valor a los elementos cuando los ve por primera vez. Antes de ello, determinará un valor zz para quien será la mediana, sin asignárselo a ningún elemento en particular. Modelaremos el avance del conocimiento del algoritmo partiendo los elementos en tres conjuntos:

  • aa es el cardinal del conjunto AA de los elementos que nunca han sido comparados (no confundir con el arreglo AA);
  • bb es el cardinal del conjunto BB de los elementos que se han comparado alguna vez y se les asignó un valor mayor a zz; y
  • cc es el cardinal del conjunto CC de los elementos que se han comparado alguna vez y se les asignó un valor menor a zz.

El algoritmo no conoce la mediana hasta el final (es decir, no sabe qué tipo de comparación está realizando). Cuando se comparen dos elementos de AA, el adversario les dará a uno un valor mayor y a otro un valor menor que zz. Cuando se compare un elemento de AA con uno de BB, le asignará al de AA un valor menor a zz. Cuando se compare un elemento de AA con uno de CC, le asignará al de AA un valor mayor a zz. Note que en estos tres casos, la comparación resultará no ser crucial. Cuando se comparen elementos de BB ó CC, responderá según los valores que ya ha asignado (estas comparaciones podrían ser cruciales).

Con estas decisiones del adversario, la siguiente tabla muestra cómo progresa el estado (a,b,c)(a,b,c) según los elementos que se comparan:

ABCA(a2,b+1,c+1)(a1,b,c+1)(a1,b+1,c)B(a,b,c)(a,b,c)C(a,b,c)\begin{array}{|c|c|c|c|} \hline & A & B & C \\ \hline A & (a-2,b+1,c+1) & (a-1,b,c+1) & (a-1,b+1,c) \\ \hline B & & (a,b,c) & (a,b,c) \\ \hline C & & & (a,b,c) \\ \hline \end{array}

Si llegamos a b=n12b=\frac{n-1}{2}, el adversario asignará a CC todos los elementos aún no comparados (es decir, les dará valores menores a zz), salvo uno que se reservará para asignarle el valor zz. Similarmente, si llegamos a c=n12c=\frac{n-1}{2}, el adversario asignará a BB todos los elementos aún no comparados menos uno. Con ello, zz resultará ser la mediana, como era el plan del adversario.

De la tabla se deduce que, como partimos de (n,0,0)(n,0,0) y continuamos hasta que bb ó cc son n12\frac{n-1}{2}, necesitamos al menos ese número de comparaciones de la primera fila de la tabla, todas las cuales son no cruciales. Se deduce entonces la cota inferior de 3(n1)2\frac{3(n-1)}{2} comparaciones para encontrar la mediana.

Se puede usar el mismo razonamiento para demostrar que encontrar el kk-ésimo elemento de un conjunto requiere n+min(k,nk)2n+\min(k,n-k)-2 comparaciones, si bien esta cota no es ajustada.