Entonces, tengo alrededor de 100-200 matrices booleanas cuadradas muy dispersas con longitud lateral ~ varias docenas, y necesito calcular su producto. Sé que si los multiplico en serie, el producto generalmente se mantendrá escaso en cada paso.
¿Hay algún algoritmo de producto de cadena de matriz que funcione particularmente rápido en este caso?
En un nivel superior, el problema es calcular la composición de una serie de asignaciones de uno a muchos en un gráfico razonablemente pequeño (funciones de transición de un NFA), donde la mayoría de los elementos se asignan a no más de 0-3.
(tenga en cuenta que este no es el problema habitual del "producto de la cadena de matriz", porque todas las matrices son del mismo tamaño y no tengo que elegir el paréntesis óptimo)
Respuestas:
Esto fue demasiado largo para ser un comentario: me pregunto si esas matrices tienen una estructura que las hace comportarse de manera diferente a las matrices aleatorias. Los productos de matrices dispersas aleatorias van a cero o se vuelven no dispersos rápidamente.
Aquí hay un experimento simple: tome 200 matrices binarias aleatorias de 50x50, y trace el número de no ceros en función del número de matrices multiplicadas. Los gráficos a continuación muestran la desviación estándar de más de 2000 carreras. El primer gráfico es para 2% de dispersión, el segundo gráfico es para 3%
(fuente: yaroslavvb.com ) (fuente: yaroslavvb.com )
Esto tomó 3 minutos en mi computadora portátil usando la multiplicación de matriz estándar
fuente