Mediana de 5 matrices ordenadas


Estoy tratando de encontrar la solución para la mediana de 5 matrices ordenadas. Esto fue una entrevista preguntas.

La solución que se me ocurrió fue fusionar los 5 arrays y luego encontrar la mediana [O(l+m+n+o+p)].

Sé que para 2 matrices ordenadas del mismo tamaño podemos hacerlo en log(2n). [comparando la mediana de ambas matrices y luego lanzando 1 mitad de cada matriz y repitiendo el proceso]. .. Encontrar mediana puede ser tiempo constante en matrices ordenadas .. así que creo que esto no es log (n)? .. ¿cuál es la complejidad temporal para esto ?

1] Existe una solución similar para 5 arrays . ¿Qué pasa si los arrays son del mismo tamaño , hay una mejor solución entonces ?

2] Supongo que ya que se le pidió 5, habría alguna solución para N matrices ordenadas ?

Gracias por cualquier sugerencia.

Algunas aclaraciones / preguntas que le hice al entrevistador:
Son los arrays de la misma longitud
= > No
Supongo que habría una superposición en los valores de matrices
=> Sí

Como ejercicio, creo que la lógica para 2 arrays no se extiende . Aquí está un intento:
Aplicando la lógica anterior de 2 arrays para decir 3 arrays: [3,7,9] [4,8,15] [2,3,9] ... medianas 7,8,3
tiro elementos [3,7,9] [4,8] [3,9] .. medianas 7,6,6
elementos de tiro [3,7] [8] [9] ..medianas 5,8,9 ...
elementos de tiro [7] [8] [9] .. mediana = 8 ... ¿Esto no parece ser correcto ?

La combinación de elementos ordenados = > [2,3,4,7,8,9,15] = > mediana esperada = 7

Author: codeObserver, 2011-05-31

3 answers

(Esta es una generalización de su idea para dos matrices.)

Si se empieza por mirar las cinco medianas de los cinco arrays, obviamente la mediana general debe estar entre la más pequeña y la más grande de las cinco medianas.

La prueba es algo como esto: Si a es el mínimo de las medianas, y b es el máximo de las medianas, entonces cada matriz tiene menos de la mitad de sus elementos menos de a y menos de la mitad de sus elementos mayores que b. El resultado sigue.

Así que en el array conteniendo a, deseche números menores que a; en el array conteniendo b, deseche números mayores que b... Pero solo deseche el mismo número de elementos de ambos arrays.

Es decir, si a es j elementos desde el inicio de su matriz, y b es k elementos desde el final de su matriz, se desechan los primeros elementos min(j,k) de la matriz de a y los últimos elementos min(j,k) de la matriz de b.

Itere hasta que haya bajado a 1 o 2 elementos en total.

Cada uno de estos las operaciones (es decir, encontrar la mediana de un array ordenado y desechar k elementos desde el principio o el final de un array) es tiempo constante. Así que cada iteración es tiempo constante.

Cada iteración arroja (más de) la mitad de los elementos de al menos una matriz, y solo puede hacer ese registro(n) veces para cada una de las cinco matrices... Así que el algoritmo general es log (n).

[Actualizar]

Como señala Himadri Choudhury en los comentarios, mi solución está incompleta; hay muchos detalles y estuches de esquina de los que preocuparse. Por lo tanto, para dar cuerpo a las cosas un poco...

Para cada uno de los cinco arrays R, defina su "mediana inferior" como R[n/2-1] y su "mediana superior" como R[n/2], donde n es el número de elementos en el array (y los arrays se indexan a partir de 0, y la división por 2 rondas hacia abajo).

Sea "a" la más pequeña de las medianas inferiores, y "b" la más grande de las medianas superiores. Si hay varios arrays con la mediana más baja más pequeña y / o múltiples arrays con el mediana superior más grande, elija a y b de diferentes matrices (este es uno de esos casos de esquina).

Ahora, tomando prestada la sugerencia de Himadri: Borrar todos los elementos hasta e incluyendo a de su array, y todos los elementos hasta e incluyendo b de su array, teniendo cuidado de eliminar el mismo número de elementos de ambos arrays. Tenga en cuenta que a y b podrían estar en la misma matriz; pero si es así, no podrían tener el mismo valor, porque de lo contrario habríamos podido elegir uno de ellos de una matriz diferente. Por lo tanto, está bien si este paso termina desechando elementos desde el principio y el final de la misma matriz.

Itere siempre y cuando tenga tres o más matrices. Pero una vez que se ha reducido a solo uno o dos arrays, tiene que cambiar su estrategia para ser exclusivo en lugar de inclusivo; solo borra hasta pero sin incluir a y hasta pero sin incluir b. Continúe así siempre y cuando ambos de los arrays restantes tengan al menos tres elementos (que garantizan el progreso).

Finalmente, se reducirá a unos pocos casos, el más complicado de los cuales son dos arreglos restantes, uno de los cuales tiene uno o dos elementos. Ahora, si te pregunto: "Dado un arreglo ordenado más uno o dos elementos adicionales, encuentra la mediana de todos los elementos", creo que puedes hacerlo en tiempo constante. (Una vez más, hay un montón de detalles para martillar, pero la idea básica es que agregar uno o dos elementos a una matriz no " empuja la mediana alrededor " mucho.)

 25
Author: Nemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-18 04:40:04

Debería ser bastante directo para aplicar la misma idea a 5 matrices.

Primero, convierte la pregunta a una más general. Encontrar el elemento Kth en N matrices ordenadas

  1. Encuentra (K/N)el elemento en cada matriz ordenada con búsqueda binaria, digamos K1, K2... KN

  2. Kmin = min (K1 ... KN), Kmax = max(K1 ... KN)

  3. Deseche todos los elementos menores que Kmin o mayores que Kmax, digamos que X elementos ha sido desechado.

  4. Ahora repita el proceso encuentra (K-X)el elemento en arrays ordenados con elementos restantes

 1
Author: Ryan Ye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 03:10:01

No es necesario hacer una fusión completa de los 5 arrays. Puede hacer una ordenación de fusión hasta que tenga (l+n+o+p + q)/2 elementos, entonces tiene el valor mediano.

 1
Author: karmakaze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-31 04:53:23