2009-11-28 14 views
6

Digamos que tengo una matriz de unos y ceros, y me gustaría un 'identificador' para esta matriz que toma el mismo valor independientemente de si la matriz se gira 90, 180 o 270 grados, es decir, un 4-to- 1 mapeo Idealmente, este identificador debe tener 1/4 del tamaño de la matriz. ¿Es posible escribir una función que haga este mapeo?¿Es posible tener un identificador de invariante rotacional de una matriz booleana?

Antecedentes: Estaba mirando this problem en el paquete de problemas de UVa. No necesito exactamente tal función para resolver el problema, pero parece razonable que exista, y usarlo sería una solución más elegante.

+0

+1 para la primera pregunta hoy en día que tuve que leer 3 veces – cdonner

Respuesta

7

Sí. Puede tomar su matriz A original y rotarla a todas las configuraciones posibles A ', A' 'y A' ''. A continuación, puede ordenarlos usando una selección de su elección (solo sea consistente), elija la primera y use la función hash que elija (de nuevo, la función hash real no importa, solo sea consistente).

Obviamente esto se puede optimizar en gran medida al no realizar la rotación y clasificación completas - puede hacer las comparaciones de forma perezosa, deteniéndose tan pronto como sepa qué rotación es la primera, pero el principio es el mismo.

+3

o no moleste en la clasificación pero produzco los 4 hash y XOR juntos. +1 para una buena idea! –

+0

Su idea también funcionaría y es más simple, pero probablemente sería más lenta porque podría ser difícil optimizarla aún más. +1 por sugerir un enfoque diferente: a veces la simplicidad es más importante que el rendimiento. –

+0

@Carl: ¿podría aclarar cómo XOR-ing los 4 valores hash siempre producirá un resultado único? – int3

1

Puede simplemente hacer un bit XOR de todas las rotaciones, que será un identificador simétrico.

Cuestiones relacionadas