2011-06-06 37 views
11

me estoy enfrentando un problema en este momento, necesito contar el número de veces que aparece una determinada matriz MxM dentro de una NxN (esta debe ser más grande que la primera) ¿Alguna pista sobre cómo hacer esto? Voy a implementarlo en C y no hay opción para cambiarlo.Algoritmo para contar las ocurrencias de una matriz dentro de una más grande

Revisión 1

Hola a todos, me gustaría decir gracias a todas las respuestas y opiniones sobre el asunto. Debo decirles que después de muchas horas de duro trabajo hemos llegado a una solución que no es estrictamente como el enfoque de Boyer-Moore, sino más bien un algoritmo por mi cuenta. Estoy planeando publicarlo una vez que haya sido probado y terminado. Las soluciones ahora se están adaptando para ser paralelizadas para la optimización de velocidad utilizando el clúster universitario con la biblioteca C MPI.

+0

¿Qué has pensado hasta ahora? –

+0

@Oli_Charlesworth estaba pensando en representaciones de matrices lineales, la forma en que c las implementa y buscando algoritmos de coincidencia de patrones vectoriales, pero hay tantas cosas en mente que necesitan algunos apuntadores para comenzar con al menos uno de ellos – guiman

Respuesta

13

Hm, parece una versión bidimensional de la coincidencia de cadenas. Me pregunto si hay una versión 2D de Boyer-Moore.

A Boyer-Moore Approach for Two-Dimensional Matching

Ah, aparentemente existe. :-)

+0

El enlace está roto. – Davidann

+0

Hm, el enlace funciona para mí ...También puede [hacer una búsqueda del título] (http://www.google.com/search?q=a+boyer-moore+approach+to+two-dimensional+matching). – Nemo

2

Un enfoque que inmediatamente vino a la mente:

Tratar la matriz grande como una cadena lineal de "personajes" N * N y la pequeña matriz como una expresión regular lineal de longitud (M + 1) * M con "caracteres literales" en las primeras M posiciones de cada "fila" y el equivalente de .{N-M} en la posición restante de cada fila. Compile la expresión regular a un DFA y ejecútelo.

El tiempo para encontrar todas las coincidencias es O (N * N). Sospecho que hay algoritmos más elegantes que funcionarían (adaptaciones de algoritmos de búsqueda de subcadenas de 1-d más elegantes), pero este no es tan malo.

1

Recientemente, se han desarrollado algoritmos rápidos para construir árboles de sufijos 2D. Éstos se pueden utilizar para encontrar cualquier submatriz cuadrada en una matriz más grande en el tiempo independiente del tamaño de la matriz más grande:

Es posible que tenga que ser suscriptor para ver esos papeles.

También me pareció que éste era de libre acceso, que describe un algoritmo de construcción aleatorio que es espera lineales de tiempo:

espero que la construcción de un árbol de sufijos 2D y búsqueda con eso sería más rápido si necesita buscar muchas submatrices diferentes en una sola matriz, pero es probable que sea más lento que Boyer-Moore 2D si va a buscar dentro de una matriz diferente cada vez.

+0

"Independiente del tamaño de la matriz más grande" es definitivamente falso. Considere buscar una submatriz 1x1 en una matriz NxN. No hay forma de encontrarlo en menos de N^2 veces. ¿Quizás quisiste decir independientemente del tamaño de la matriz más pequeña ...? –

+0

@ R .: Se está olvidando el tiempo de construcción del índice, que por supuesto necesita ver todos los elementos NxN. Una vez creado, un árbol de sufijos 2D le permitirá buscar una submatriz 1x1 en una matriz NxN en aproximadamente un solo paso, al igual que un árbol de sufijo 1D le permitirá encontrar si aparece "banana" en todas las obras de Shakespeare en aproximadamente 6 pasos . (Esa es la complejidad del tiempo para encontrar una sola ocurrencia: para enumerar todas las ocurrencias, se necesita más tiempo). –

Cuestiones relacionadas