2011-05-31 23 views
40

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

La solución que se me ocurrió fue fusionar los 5 arreglos 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 arrojando 1 mitad de cada arreglo y repitiendo el proceso]. .. Encontrar la mediana puede ser un tiempo constante en matrices ordenadas ... ¿así que creo que esto no es log (n)? ¿Cuál es la complejidad del tiempo para esto?

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

2] Supongo que, dado que esto se solicitó para 5, ¿habría alguna solución para N matrices ordenadas?

Gracias por cualquier apuntador.

algunas aclaraciones/preguntas que les pide de nuevo al entrevistador:
son las matrices de igual longitud
=> No se
supongo que habría una superposición en los valores de las matrices
=> Sí

Como ejercicio, creo que la lógica de 2 matrices no se extiende. Aquí hay una prueba:
Aplicando la lógica anterior de 2 matrices para decir 3 matrices: [3,7,9] [4,8,15] [2,3,9] ... medianas 7,8,3
elementos de proyección [3,7,9] [4,8] [3,9] .. medianas 7,6,6
elementos de proyección [3,7] [8] [9] ..medians 5,8 , 9 ...
elementos de proyección [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

+1

¿Están cada uno individualmente ordenados, o cada conjunto también representa un rango dentro del cual no hay ningún valor de otro de los conjuntos? es decir, si uno tiene valores en el rango 1-5, ¿podría otro tener valores en el mismo rango? De lo contrario, solo necesita determinar el orden de las matrices (rango más bajo al más alto), sumar todas sus longitudes, dividir entre 2 para el elemento medio e ir a la matriz que tiene ese elemento. –

+0

Gracias filip-fku. Dirigí tus preguntas. – codeObserver

+2

Es un problema notorio porque la idea es relativamente fácil pero es extremadamente difícil de implementar correctamente. Para k> 2, la implementación empeora. Para mí, esta no es una buena para entrevistas tecnológicas. – galactica

Respuesta

25

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

Si comienza mirando las cinco medianas de las cinco matrices, 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 conjunto tiene menos de la mitad de sus elementos menos de a y menos de la mitad de sus elementos mayores que segundo. El resultado sigue

Por lo tanto, en la matriz que contiene a, tirar números menos que a; en la matriz que contiene b, tirar números mayores que b ... Pero solo tirar la misma cantidad de elementos de ambas matrices.

Es decir, si a es j elementos desde el comienzo de su matriz, yb es k elementos del final de su matriz, tirar los primeros elementos min (j, k) de una matriz y el último min (j, k) elementos de la matriz de b.

Itegre hasta que tenga 1 o 2 elementos en total.

Cada una de estas operaciones (es decir, encontrar la mediana de una matriz ordenada y tirar los elementos k desde el inicio o el final de una matriz) es un tiempo constante. Entonces cada iteración es tiempo constante.

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

[Actualización]

Como señala Himadri Choudhury en los comentarios, mi solución es incompleta; hay muchos detalles y casos de esquina de los que preocuparse. Entonces, para aclarar un poco las cosas ...

Para cada una de las cinco matrices 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 la matriz (y las matrices están indexadas desde 0 y la división por 2 rondas).

Deje que "a" sea la más pequeña de las medianas inferiores, y "b" sea la más grande de las medianas superiores. Si hay múltiples matrices con la mediana inferior más pequeña y/o matrices múltiples con la mediana superior más grande, elija ayb de diferentes matrices (este es uno de esos casos de esquina).

Ahora, tomando prestado sugerencia de Himadri: Borra todos los elementos hasta e incluyendo una de su matriz, y todos los elementos abajo a e incluyendo b de su matriz, teniendo cuidado de eliminar el mismo número de elementos de ambas matrices . 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 hubiéramos podido elegir uno de ellos de una matriz diferente. Por lo tanto, está bien si este paso termina tirando elementos desde el inicio y el final de la misma matriz.

Iterate siempre que tengas tres o más matrices. Pero una vez que se reduce a una o dos matrices, debe cambiar su estrategia para que sea exclusiva en lugar de inclusiva; solo borra hasta pero no incluye ay hasta pero no incluye b. Continúa así siempre que las dos o las dos matrices restantes tengan al menos tres elementos (lo que garantiza que progreses).

Por último, reducirá a unos pocos casos, el más delicado de los cuales es dos matrices restantes, uno de los cuales tiene uno o dos elementos. Ahora, si te pregunto: "Dada una matriz ordenada 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 destacar, pero la idea básica es que agregar uno o dos elementos a una matriz no "empuja mucho" a la mediana).

+0

Parece que con este enfoque terminamos reduciendo la primera y la última matriz. ¿Puede explicar con un ejemplo, aquí está mi intento para 3 matrices ... [3,7,9] [4,8,15] [2,3,9] ... Medianas 7,8,3 .. tirar elementos [3,7,9] [4,8] [3,9] .. medianas 7,6,6 .. tirar elementos [3,7] [8] [9] ..medians 5,8,9. .. throw elements [7] [8] [9] .. median = 8 ... ¿Esto no parece ser correcto? – codeObserver

+0

Usted reduce tanto la primera como la última matriz, pero para la prueba de tiempo de ejecución solo necesita saber que tira al menos la mitad de una matriz. No sé si es posible vencer a O (log n). Buena pregunta de entrevista, por cierto. – Nemo

+2

La solución debe modificarse para que pueda descartar números> = a la mediana máxima y <= a la mediana más pequeña (en lugar de estricta> o <). De lo contrario, digamos que una matriz tiene solo 1 elemento, entonces no podrá tirar nada, y todo el proceso se colgará allí mismo. De lo contrario, esta es una buena solución. –

1

Debe ser bastante directo para aplicar el misma idea a 5 matrices.

Primero, convierta la pregunta en una más general. Encontrar k-ésimo elemento en N ordenadas matrices

  1. Find (K/N) th elemento de cada matriz ordenada con búsqueda binaria, por ejemplo K1, K2 ... KN

  2. Kmín = min (K1 .. . KN), Kmax = max (K1 ... KN)

  3. Deseche todos los elementos a menos de Kmin o mayores que Kmax, digamos que X elementos se han desechado.

  4. Ahora repita el proceso por el hallazgo (K - X) -ésimo elemento de matrices ordenadas con elementos restantes

+0

La búsqueda binaria sola es log (n), y usted lo está haciendo log (n) veces, entonces esto es O ((log (n))^2). Pero puede resolver este problema en O (log n) :-) – Nemo

+1

Cada matriz está ordenada, por lo que no necesita búsqueda binaria para encontrar sus (N/K) elementos más pequeños. Solo son A1 [N/K], A2 [N/K], .... – JeffE

+0

No veo para qué usar 'Kmax' en 1. & 2 .. Probablemente necesites _Si 0 <(K-Xₙ) greybeard

2

Usted no necesita hacer una fusión completa de los 5 conjuntos.Puedes hacer un tipo de fusión hasta que tengas (l + n + o + p + q)/2 elementos, entonces tienes el valor mediano.

+3

Ni siquiera necesita hacer el orden, solo las comparaciones. Solo necesita guardar el elemento a la mitad de todos los miembros de las 5 matrices ordenadas. – xpda

Cuestiones relacionadas