He estado pensando en esta pregunta de tarea por un momento. Dada una matriz numérica de tamaño n, diseñe un algoritmo que encuentre los valores altos y bajos con, como máximo, 1,5n de comparaciones.Algoritmo para encontrar números altos/bajos con a lo sumo 1.5n comparaciones
Mi primer intento fue
int high=0
int low= Number.MaxValue //problem statement is unclear on what type of number to use
Number numList[0 . . n] //number array, assuming unsorted
for (i=0, i < n, i++) {
if (numList[i] > high)
high = numList[i]
else if (numList[i] < low)
low = numList[i]
}
Mi problema es cada iteración del bucle tiene una de tres posibilidades:
- de bajo valor se encuentra - 1 comparación hecha
- alto valor se encuentra - 2 comparaciones hechas
- ninguna se encuentra - 2 comparaciones hechas
Por lo tanto, para un recorrido completo de la matriz, se pueden hacer un máximo de 2n comparaciones, lo cual está muy lejos del requisito máximo de 1.5n de las comparaciones.
En este tipo de problemas, el mejor valor de partida es el primer elemento. – wildplasser
@wildplasser, ¿quieres decir inicializar tanto alto como bajo con el primer valor del elemento? – Jason
Sí. Eso evita elegir un valor centinela arbitrario {menor, más alto} que el posible. El caso de 'matriz vacía' es siempre especial (tiene * no * el más bajo, más alto) – wildplasser