2010-11-25 24 views
17

Dada una matriz con m filas yn columnas, cada una de las cuales está ordenada. ¿Cómo clasificar de manera eficiente toda la matriz?¿Cómo ordenar una matriz m x n que tiene todas sus m filas ordenadas y n columnas ordenadas?

sé una solución que se ejecuta en O (mn log (min (m, n)). Estoy en busca de una solución mejor.

El enfoque que sé básicamente toma 2 filas/cols a la vez y se aplica fusionar operación

Aquí se muestra un ejemplo:..

[[1,4,7,10], 

[2,5,8,11], 

[3,6,9,12]] 

es el Martix de entrada que tiene cada fila y columna ordenada

salida esperada es:

[1,2,3,4,5,6,7,8,9,10,11,12] 

Otro ejemplo:

[[1, 2, 3, 3, 4, 5, 6, 6, 7, 7], 

[1, 2, 4, 6, 7, 7, 8, 8, 9,10], 

[3, 3, 4, 8, 8, 9,10,11,11,12], 

[3, 3, 5, 8, 8, 9,12,12,13,14]] 
+1

¿Se conoce el valor más alto para una celda en la matriz? ¿La complejidad de la memoria es un problema? – Neowizard

+1

La pregunta es bastante ambigua: intente dar un ejemplo antes/después para una matriz m x n pequeña. –

+0

creo que solo quiere ordenar los valores en la matriz. (es decir, dada esa estructura particular de valores, ¿cuál es una forma eficiente de ordenar los valores?) – lijie

Respuesta

46

No creo que puede hacerlo más rápido que Ω (MN registro (min (m , n)), por lo menos no en el caso general.

Supongamos (sin pérdida de generalidad) que m < n. Luego, su matriz se ve así:

a matrix with rows and columns sorted

Cada círculo es una entrada de la matriz y cada flecha indica una relación de orden conocida (la entrada en la fuente de la flecha es menor que la entrada en el destino de la flecha)

Para ordenar la matriz, que debe resolver todas las relaciones de orden desconocidos, algunos de los cuales se muestran en los cuadros grises aquí:

the order relations remaining to be resolved

Ordenación de todas estas cajas de toma:

2 Σ k < m Ω (k registro k) + (n-m + 1) Ω (m registro m)

= 2 Ω (m ² registro m) + (n - m + 1) Ω (m registro m)

= Ω (mn registro m)

+0

+1 Para la respuesta mejor presentada que he visto a cualquier pregunta. También me parece correcto, pero eso se tornó insignificante. – Orbling

+0

¡Guau! Gracias por la explicación. Se ve bien. No entendí un par de cosas: 1. ¿De dónde viene el segundo término, (n - m + 1) Ω (m log m)? Y 2.Me pregunto si existe un límite superior más estricto para Σk

+0

El (* n * - * m * + 1) Ω (* m * log * m *) proviene de los recuadros grises diagonales que abarcan la matriz de abajo hacia arriba: cada cuadro contiene elementos * m *, y hay (* n * - * m * + 1) de ellos. En cuanto a su otra pregunta, Ω es un límite * inferior *, no un límite superior. –

0

Si los elementos son números enteros dentro de un cierto rango k, donde K = O (mn), podemos utilizar recuento tipo con espacio extra para alcanzar O (mn), de lo contrario el mnlog (min (m, n)) es lo mejor que podemos hacer.

0

Al crear un árbol de búsqueda binaria, podemos lograr esto en el tiempo O (mn). Tome el último elemento de la primera columna (elemento 3 en el ejemplo mencionado anteriormente), hágalo como raíz. Los nodos derechos serán los n mayores elementos de esa última fila y el nodo izquierdo será el elemento anterior, es decir. el (m-1) th o el 1er elemento de la segunda última fila. De manera similar para este elemento, los nodos correctos serán los n elementos de esa fila. De nuevo m-2 será el elemento de la izquierda y todos los n elementos en su fila serán los elementos correctos. Del mismo modo, avanzando, tendremos un árbol de búsqueda binaria creado en el tiempo O (mn). Esto es O (mn) porque no estamos buscando mientras insertamos, es una inserción simple al atravesar cambiando el puntero del nodo raíz. Luego se realizará el recorrido inorden de este BST, que también será el tiempo O (mn).

+0

El procedimiento que describe garantiza _los nodos leídos_ no serán más grandes y _los nodos derechos_ no serán más pequeños que sus padres. No _ necesariamente_ construye una BST - considere el segundo ejemplo (primer elemento de la segunda columna más pequeño último de first = root) o similarmente a₁₁ = 1, a₁₂ = 2, a₂₁ = 3, a₂₂ = 4. – greybeard

Cuestiones relacionadas