Articulo de referencia

Recorrido de grafos de memoria externa

El recorrido de grafos de memoria externa es un tipo de recorrido de grafos optimizado para acceder a la memoria almacenada externamente. Fondo El recorrido de grafos es una sub...

El recorrido de grafos de memoria externa es un tipo de recorrido de grafos optimizado para acceder a la memoria almacenada externamente.

Fondo

El recorrido de grafos es una subrutina en la mayoría de los algoritmos de grafos. El objetivo de un algoritmo de recorrido de grafos es visitar (y/o procesar) cada nodo del grafo. Los algoritmos de recorrido de grafos, como la búsqueda en amplitud y la búsqueda en profundidad , se analizan utilizando el modelo de von Neumann , que asume un coste de acceso a la memoria uniforme. Esta perspectiva ignora el hecho de que, para instancias muy grandes, parte del grafo reside en el disco en lugar de en la memoria interna. Dado que el acceso al disco es mucho más lento que el acceso a la memoria interna, existe la necesidad de un recorrido eficiente de la memoria externa .

Modelo de memoria externa

Para los algoritmos de memoria externa, se utiliza el modelo de memoria externa de Aggarwal y Vitter [ 1 ] para el análisis. Una máquina se especifica mediante tres parámetros: M , B y D. M es el tamaño de la memoria interna, B es el tamaño del bloque de un disco y D es el número de discos paralelos. La medida del rendimiento de un algoritmo de memoria externa es el número de operaciones de entrada/salida que realiza.

El algoritmo de búsqueda en anchura comienza en un nodo raíz y recorre todos los nodos hasta una profundidad de uno. Si no quedan nodos sin visitar en la profundidad actual, se recorren los nodos de mayor profundidad. Finalmente, se habrán visitado todos los nodos del grafo.

Munagala y Ranade

Visualización para el cálculo de L(t) en el algoritmo de búsqueda en anchura de Munagala-Ranade .

Para un grafo no dirigidoGRAMO{\displaystyle G}Munagala y Ranade [ 2 ] propusieron el siguiente algoritmo de memoria externa:

DejarL(t){\displaystyle L(t)}denotemos los nodos en el nivel de búsqueda en amplitud t y seaA(t):=norte(L(t1)){\displaystyle A(t):=N(L(t-1))}sea ​​el multiconjunto de vecinos de nivel t-1. Para cada t,L(t){\displaystyle L(t)}se puede construir a partir deA(t){\displaystyle A(t)}transformándolo en un conjunto y excluyendo de él los nodos visitados previamente.

  1. CrearA(t){\displaystyle A(t)}accediendo a la lista de adyacencia de cada vértice enL(t1){\displaystyle L(t-1)}Este paso requiereO(|L(t1)|+|A(t)|/(DB)){\displaystyle O(|L(t-1)|+|A(t)|/(D\cdot B))}E/S.
  2. PróximoA(t){\displaystyle A'(t)}se crea a partir deA(t){\displaystyle A(t)}eliminando duplicados. Esto se puede lograr mediante la ordenación deA(t){\displaystyle A(t)}, seguido de una fase de escaneo y compactación que requiereO(clasificar(|A|)){\displaystyle O(\operatorname {sort} (|A|))}E/S.
  3. L(t):=A(t){L(t1)L(t2)}{\displaystyle L(t):=A'(t)\backslash \{L(t-1)\cup L(t-2)\}}se calcula mediante un escaneo paralelo sobreL(t1){\displaystyle L(t-1)}yL(t2){\displaystyle L(t-2)}y requiereO((|A(t)|+|L(t1)|+|L(t2)|)/(DB)){\displaystyle O((|A(t)|+|L(t-1)|+|L(t-2)|)/(D\cdot B))}E/S.

El número total de E/S de este algoritmo sigue teniendo en cuenta quet|A(t)|=O(metro){\displaystyle \sum _{t}|A(t)|=O(m)}yt|L(t)|=O(norte){\displaystyle \sum _{t}|L(t)|=O(n)}y esO(norte+clasificar(norte+metro)){\displaystyle O(n+\operatorname {sort} (n+m))}.

En la figura de la derecha se muestra una representación visual de los tres pasos descritos necesarios para calcular L ( t ).

Mehlhorn y Meyer

Mehlhorn y Meyer [ 3 ] propusieron un algoritmo que se basa en el algoritmo de Munagala y Ranade (MR) y mejora su resultado.

Consta de dos fases. En la primera fase se preprocesa el grafo, y en la segunda se realiza una búsqueda en amplitud utilizando la información recopilada en la primera fase.

Durante la fase de preprocesamiento, el grafo se divide en subgrafos disjuntos.Si,0iK{\displaystyle S_{i},\,0\leq i\leq K}con diámetro pequeño. Además, divide las listas de adyacencia en consecuencia, mediante la construcción de un archivo externo.F=F0F1FK1{\displaystyle F=F_{0}F_{1}\dots F_{K-1}}, dóndeFi{\displaystyle F_{i}}contiene la lista de adyacencia para todos los nodos enSi{\displaystyle S_{i}}.

La fase de búsqueda en amplitud es similar al algoritmo MR. Además, el algoritmo mantiene un archivo externo ordenado H. Este archivo se inicializa conF0{\displaystyle F_{0}}Además, los nodos de cualquier nivel de búsqueda en amplitud creado contienen identificadores para los archivos.Fi{\displaystyle F_{i}}de sus respectivos subgrafosSi{\displaystyle S_{i}}En lugar de utilizar accesos aleatorios para construirL(t){\displaystyle L(t)}Se utiliza el archivo H.

  1. Realizar un escaneo paralelo de la lista ordenadaL(t1){\displaystyle L(t-1)}y H. Extraer las listas de adyacencia para los nodos.vL(t1){\displaystyle v\in L(t-1)}, que se puede encontrar en H .
  2. Es necesario obtener las listas de adyacencia para los nodos restantes que no se pudieron encontrar en H. Un escaneo sobreL(t1){\displaystyle L(t-1)}produce los identificadores de partición. Después de ordenar y eliminar los duplicados, los archivos respectivosFi{\displaystyle F_{i}}se puede concatenar en un archivo temporal F' .
  3. Las listas de adyacencia faltantes se pueden extraer de F' mediante un escaneo. A continuación, las listas de adyacencia restantes se fusionan en H en una sola pasada.
  4. A(t){\displaystyle A(t)}se crea mediante un escaneo simple. La información de partición se adjunta a cada nodo enA(t){\displaystyle A(t)}.
  5. El algoritmo procede de forma similar al algoritmo MR.

En H , es posible que se escaneen los bordes con mayor frecuencia , pero se reducen las operaciones de E/S no estructuradas para obtener las listas de adyacencia.

El número total de E/S para este algoritmo esO(norte(norte+metro)DB+clasificar(norte+metro)){\displaystyle O\left({\sqrt {\frac {n\cdot (n+m)}{D\cdot B}}}+\operatorname {sort} (n+m)\right)}

El algoritmo de búsqueda en profundidad explora un grafo a lo largo de cada rama hasta la mayor profundidad posible, antes de realizar el rastreo inverso.

Para grafos dirigidos , Buchsbaum, Goldwasser, Venkatasubramanian y Westbrook [ 4 ] propusieron un algoritmo conO((V+mi/B)registro2(V/B)+clasificar(mi)){\displaystyle O((V+E/B)\log _{2}(V/B)+\operatorname {sort} (E))}E/S.

Este algoritmo se basa en una estructura de datos llamada árbol de repositorio con búfer (BRT). Almacena un conjunto múltiple de elementos de un universo ordenado. Los elementos se identifican mediante una clave. Un BRT ofrece dos operaciones:

  • insert(T, x), que agrega el elemento x a T y necesitaO(1/Bregistro2(norte/B)){\displaystyle O(1/B\log _{2}(N/B))}E/S amortizadas. N es el número de elementos añadidos al BTR.
  • extract(T, k), que informa y elimina de T todos los elementos con clave k . RequiereO(registro2(norte/B)+S/B){\displaystyle O(\log _{2}(N/B)+S/B)}E/S, donde S es el tamaño del conjunto devuelto por extract .

El algoritmo simula un algoritmo interno de búsqueda en profundidad. Se mantiene una pila S de nodos. Durante una iteración para el nodo v en la parte superior de S , se agrega un vecino no visitado a S y se continúa la iteración. Si no hay vecinos no visitados, se elimina v .

La dificultad radica en determinar si un nodo no ha sido visitado sin realizar ninguna acción.Ω(1){\displaystyle \Omega (1)}E/S por arista. Para hacer esto para un nodo v aristas entrantes (incógnita,v){\displaystyle (x,v)}Los nodos se colocan en un BRT D cuando v se descubre por primera vez. Además, los nodos salientes ( v , x ) se colocan en una cola de prioridad P ( v ), indexada por el rango en la lista de adyacencia.

Para el vértice u en la parte superior de S, se extraen todas las aristas ( u , x ) de D. Dichas aristas solo existen si x se ha descubierto desde la última vez que u estuvo en la parte superior de S (o desde el inicio del algoritmo si u es la primera vez que está en la parte superior de S ). Para cada arista ( u , x ) se realiza una operación delete( x ) en P ( u ). Finalmente, se realiza una operación delete- min enPAG(){\displaystyle P(u)} devuelve el siguiente nodo no visitado. Si P ( u ) está vacío, u se extrae de S .

A continuación se muestra el pseudocódigo de este algoritmo.

1 procedimiento BGVW-depth-first-search( G , v ): 2. Sea S una pila, P [] una cola de prioridad para cada nodo y D un BRT. 3 S .push( v ) 4 mientras S no esté vacío: 5 v := S .top() 6 si v no está marcado: 7 marcas ( v ) 8 extraer todas las aristas (v, x) de D , x : P [ v ].delete( x ) 9 si ( u := P [ v ].delete-min()) no es nulo: 10 S .push( u ) 11 más : 12 S .pop() 13. Marca de procedimiento ( v ) 14 poner todas las aristas ( x , v ) en D 15  ( v , x ): poner x en P [ v ]

Referencias

  1. Aggarwal, Alok; Vitter, Jeffrey (1988). "La complejidad de entrada/salida de la clasificación y problemas relacionados" . Communications of the ACM . 31 (9): 1116– 1127. doi : 10.1145/48529.48535 .
  2. Munagala, Kameshwar; Ranade, Abhiram (1999). "Complejidad de E/S de los algoritmos de grafos". Actas del Décimo Simposio Anual ACM-SIAM sobre Algoritmos Discretos . SODA '99. Baltimore, Maryland, EE. UU.: Society for Industrial and Applied Mathematics. págs. 687–694 . 
  3. Mehlhorn, Kurt; Meyer, Ulrich (2002). "Búsqueda en amplitud con memoria externa y E/S sublineal". Algoritmos - ESA 2002. ESA 2002. Roma, Italia: Springer Berlin Heidelberg. págs. 723–735 . 
  4. Buchsbaum, Adam L.; Goldwasser, Michael; Venkatasubramanian, Michael; Westbrook, Suresh (2000). "Sobre el recorrido de grafos con memoria externa". Actas del undécimo simposio anual ACM-SIAM sobre algoritmos discretos . SODA '00. San Francisco, California, EE. UU.: Society for Industrial and Applied Mathematics. págs. 859–860 .