2011-08-30 11 views
6

El siguiente problema es tomada de Problems on Algorithms (Problema 653):filas permutar de una matriz para eliminar subsecuencias crecientes

se le da una matriz de n x 2 de números. Encuentre un algoritmo O (n log n) que permute las filas en la matriz de modo que ninguna columna de la matriz contenga una subsecuencia creciente (que puede no consistir en elementos de la matriz contigua) más larga que ⌈ √ n. ⌉

No estoy seguro de cómo solucionar esto. Creo que podría usar algún tipo de recurrencia de divide y vencerás, pero parece que no puedo encontrar ninguna.

¿Alguien tiene alguna idea de cómo solucionar esto?

+0

más largo que * raíz * cuadrado de n? –

+1

es el problema 653 en el libro 'Problemas con los algoritmos' – GEP

+0

Aquí hay un enlace al pdf del libro: http: //larc.unt.edu/ian/books/free/license.html – GEP

Respuesta

5

Heres es mi solución.

1) Ordene las filas según el primer elemento, de mayor a menor.

1 6 5 1 
3 3 -\ 3 3 
2 4 -/ 2 4 
5 1 1 6 

2) Dividir en grupos de ⌈√n⌉, y lo que queda (no más de grupos ⌈√n⌉)

5 1 5 1 
3 3 -\ 3 3 
2 4 -/ 
1 6 2 4 
     1 6 

3) Clasificar filas en cada grupo de acuerdo con la segundo elemento de mayor a menor

5 1 3 3 
3 3 5 1 
    -> 
2 4 1 6 
1 6 2 4 

prueba de la corrección:

subsecuencias cada vez mayor en la columna 1 pueden ocurrir sólo en un solo grupo (el tamaño es < = ⌈√n⌉),

No 2 elementos de aumento de subsecuencias en la columna 2 están en el mismo grupo (no más de grupos ⌈√n⌉)

+2

Ahh, tan simple. ¿Por qué no lo vi? Buen trabajo. – quasiverse

+0

¿Cuánto tiempo te tomó resolverlo? – GEP

+1

Alrededor de 5 minutos. Empecé a pensar cómo iba a resolver el problema 1xn (una sola columna). – kilotaras

Cuestiones relacionadas