¿Cuál es el algoritmo más rápido para encontrar todas las rutas más cortas en un gráfico disperso?

24

En un gráfico no ponderado, no dirigido, con vértices V y bordes E tales que 2V>E , ¿cuál es la forma más rápida de encontrar todos los caminos más cortos en un gráfico? ¿Se puede hacer más rápido que Floyd-Warshall que es O(V3) pero muy rápido por iteración?

¿Qué tal si la gráfica está ponderada?

Jakob Weisblat
fuente

Respuestas:

32

Como se trata de un gráfico no ponderado, puede ejecutar una búsqueda de Breadth First (BFS) desde cada vértice v del gráfico. Cada ejecución de BFS le brinda las distancias más cortas (y rutas) desde el vértice inicial hasta cualquier otro vértice. La complejidad de tiempo para un BFS es O(V+E)=O(V) ya que E=O(V) en su gráfico escaso. Ejecutarlo V veces le da una complejidad de tiempo O(V2) .

Para un gráfico dirigido ponderado, el algoritmo de Johnson sugerido por Yuval es el más rápido para gráficos dispersos. Se necesita O(V2logV+VE) que en su caso resulta ser O(V2logV) . Para un gráfico ponderado no dirigido, puede ejecutar el algoritmo de Dijkstradesde cada nodo, o reemplace cada borde no dirigido con dos bordes opuestos y ejecute el algoritmo de Johnson. Ambos darán los mismos tiempos asintóticos que el algoritmo de Johnson anterior para su caso escaso. También tenga en cuenta que el enfoque BFS que menciono anteriormente funciona tanto para gráficos dirigidos como no dirigidos.

Paresh
fuente
7

Puede intentar hacer una versión de Floyd-Warshall que sea más rápida en matrices dispersas.

Primero, recordemos lo que hace este algoritmo:

MMi,jijMi,j=

Vki,j

Mi,jmin{Mi,j,Mi,k+Mk,j}.

Claramente, si o entonces no es necesario realizar ninguna actualización. Por lo tanto, en los primeros pasos del algoritmo, solo necesitamos realizar aproximadamente comparaciones donde y denotan el número de bordes entrantes y salientes del -ésimo nodo respectivamente. A medida que avanza el algoritmo, se llenan más y más entradas de la matrizPor lo tanto, los últimos pasos pueden llevar mucho más tiempo.Mi,k=Mk,j=degin(k)degout(k)degin(k)degout(k)kM

Tenga en cuenta que necesitamos una manera eficiente para repetir sólo las células sobre los no-infinitos en el fila ésima y la columna de la matriz. Esto se puede hacer manteniendo un conjunto de bordes entrantes y salientes para cada nodo.k

Parece que los primeros pasos del algoritmo pueden beneficiarse enormemente de la escasez. Por ejemplo, un gráfico construido aleatoriamente con sugiere que la primera iteración ( ) es solo pasos. Si el gráfico se divide en muchos componentes conectados, la matriz permanecería relativamente escasa en todo el algoritmo y el tiempo de ejecución total podría ser tan bajo como . Por otro lado, si el gráfico contiene solo un componente conectado, entonces la última iteraciónse espera que tome pasos. En este caso, el tiempo de ejecución total podría ser . Tan grande como la versión no dispersa.E=O(V)k=0O(1)MO(V)k=|V|O(V2)O(V3)

Amit Moscovich
fuente