Mínimo y máximo de un arreglo
Consideremos ahora el problema de encontrar el mínimo y el máximo de un arreglo . Una forma de resolver este problema es encontrar el máximo de usando comparaciones, y luego, excluyendo el máximo, encontrar el mínimo de los elementos restantes usando comparaciones. En total este algoritmo realiza comparaciones.
Para ver si es óptimo, usaremos un modelo que extiende el que acabamos de usar, dividiendo el conjunto en cuatro:
- es el cardinal del conjunto de los elementos que nunca han sido comparados (nuevamente, no confundir con el arreglo );
- es el cardinal del conjunto de los elementos que se han comparado alguna vez y han ganado (han resultado mayores) en todas sus comparaciones;
- es el cardinal del conjunto de los elementos que se han comparado alguna vez y han perdido (han resultado menores) en todas sus comparaciones; y
- es el cardinal del conjunto de los elementos que han ganado alguna vez y también han perdido alguna vez.
El estado inicial es ahora , y el estado final es . La tabla de resultados de comparaciones es ahora la siguiente:
Hemos tachado resultados que el adversario podría evitar siempre con la estrategia de "los ganadores siguen ganando y los perdedores siguen perdiendo", que siempre es consistente. Podríamos tachar otros resultados, pero no es necesario para establecer nuestra cota inferior. Observe que (1) decrece a lo sumo de a dos, (2) crece a lo sumo de a uno, y (3) nunca decrece al mismo tiempo que crece. Entonces, como debe pasar de a y debe pasar de a , tenemos una cota inferior de comparaciones para resolver este problema.
Esta vez nuestra cota inferior es distinta de la cota superior . Nos podemos preguntar si será una cota inferior ajustada. Tal vez el modelo es muy débil o el adversario no es muy inteligente o nuestra observación sobre cómo llegar del estado inicial al final no es suficiente para demostrar que realmente se necesitan comparaciones.
Veremos que no es así, usando el modelo para encontrar un algoritmo óptimo. La tabla sugiere que la forma más rápida de llegar al estado final es usar celdas veces hasta llegar al estado . Luego podemos usar veces para llegar a y finalmente usar veces para llegar al estado final, . Esto equivale a realizar un primer nivel de torneo de tenis, comparando cada celda impar con la siguiente celda par, obteniendo ganadores y perdedores. Luego, buscamos (con cualquiera de los algoritmos vistos) el máximo entre los ganadores y el mínimo entre los perdedores. El costo total es (note que se necesitan dos comparaciones más si es impar).
Con esto tenemos que la cota de comparaciones es ajustada, que nuestro algoritmo inicial no era óptimo, y que usamos el modelo de la cota inferior para ayudarnos a encontrar un algoritmo óptimo en términos del número de comparaciones.