Cómo encontrar la mediana de m matrices ordenadas

Es curioso, porque me hicieron exactamente la misma pregunta en una entrevista telefónica recientemente.

Lo resolví de la siguiente manera (suponiendo que desea la mediana sobre todos los valores): solo necesita avanzar más allá de la mitad de los valores más pequeños. Por lo tanto, puede mantener una lista de punteros al comienzo de cada matriz. Tenga el valor en la parte superior de estas matrices (junto con un puntero que le indica de qué matriz proceden) almacenadas en un contenedor, por ejemplo, un montón para que pueda recuperar fácilmente la más baja.

Ahora ejecute en un bucle: encuentre el número más bajo del montón. Elimine ese elemento y avance el puntero de la matriz correspondiente. Agregue el siguiente número de esa matriz al montón. Continúe esto n / 2 veces (donde n es el número total de elementos en todas las matrices). Si n es par, devuelve la media de los dos últimos elementos extraídos; de lo contrario, solo devuelve el último elemento extraído.

Este algoritmo debe ser O (n log k), donde n es el número total de elementos yk es el número de matrices.

(en la entrevista, en realidad no pensé en el montón y lo almacené en una lista, lo que hizo que el algoritmo O (n * k). Me di cuenta de la idea del montón justo después de colgar: ‘()

La mediana está en el medio. Si tiene un número impar de valores.

x = matriz [array.length / 2];

Si hay un número par de valores que puede usar

x = (matriz [matriz.length / 2] + matriz [array.length / 2 + 1]) / 2.0;

Usualmente uso el primero por simplicidad.

La mediana de una matriz ordenada es simplemente A [mid] que es el elemento central de la matriz.
Aquí, mid = (izquierda + derecha) / 2
Usando la fórmula normal para encontrar una mediana en datos ordenados.

Cree una nueva matriz con medianas de las m matrices. Use quickselect () para encontrar la mediana.
Es el rendimiento promedio del caso lleva tiempo lineal.
Consulte: http://wikipedia.org/wiki/Quicks

quickselect () es una versión modificada de la subrutina de partición del algoritmo de ordenación rápida.

Otra forma es usar recursivamente una mediana de subrutina mediana.