¿Cuáles son los algoritmos más eficientes en la práctica para multiplicar dos matrices booleanas muy dispersas (digamos, N = 200 y solo hay unos 100-200 elementos distintos de cero)?
En realidad, tengo la ventaja de que cuando multiplico A por B, las B están predefinidas y puedo hacer un preprocesamiento complejo arbitrario en ellas. También sé que los resultados de los productos son siempre tan escasos como las matrices originales.
El algoritmo "bastante ingenuo" (escaneo A por filas; por cada 1 bit de la fila A, O el resultado con la fila correspondiente de B) resulta muy eficiente y requiere solo un par de miles de instrucciones de la CPU para calcular un solo producto , por lo que no será fácil superarlo, y solo es superable por un factor constante (porque hay cientos de un bit en el resultado). Pero no estoy perdiendo la esperanza y pidiendo ayuda a la comunidad :)
Respuestas:
Era reacio a responder esto, porque el único resultado teórico que conozco en este sentido tiene mi nombre en el papel ...
(Nota: este algoritmo solo es realmente útil para el caso en que una matriz es densa y la otra es escasa. Sin embargo, este caso aparece mucho, por ejemplo, al calcular el cierre transitivo de un gráfico disperso, la matriz de cierre transitivo eventualmente se volverá densa en comparación con la matriz de adyacencia original).
El papel es
- Las actualizaciones de fila y columna a se pueden calcular en tiempo .A O(n1+ε)
Utilizamos esta estructura de datos para proporcionar algoritmos teóricos más rápidos para APSP en gráficos dispersos no pesados.
fuente
Creo que lo que llamas es una matriz "hipersparse" (nnz <n). Hace unos años escribí un artículo sobre cómo multiplicarlos. Esencialmente, es una combinación de producto externo con una inteligente combinación de múltiples vías para eliminar la realización de triples intermedios.
Buluc y Gilbert, IPDPS 2008: http://gauss.cs.ucsb.edu/publication/hypersparse-ipdps08.pdf
fuente