Algoritmo de búsqueda en paralelo
La búsqueda es una de las operaciones fundamentales en informática. Se usa en todas las aplicaciones donde necesitamos encontrar si un elemento está en la lista dada o no. En este capítulo, discutiremos los siguientes algoritmos de búsqueda:
- Divide y conquistaras
- Búsqueda en profundidad
- Búsqueda primero en amplitud
- Mejor búsqueda primero
Divide y conquistaras
En el enfoque de divide y vencerás, el problema se divide en varios subproblemas pequeños. Luego, los subproblemas se resuelven de forma recursiva y se combinan para obtener la solución del problema original.
El enfoque de divide y vencerás implica los siguientes pasos en cada nivel:
Divide - El problema original se divide en subproblemas.
Conquer - Los subproblemas se resuelven de forma recursiva.
Combine - Las soluciones de los subproblemas se combinan para obtener la solución del problema original.
La búsqueda binaria es un ejemplo de algoritmo de divide y vencerás.
Pseudocódigo
Binarysearch(a, b, low, high)
if low < high then
return NOT FOUND
else
mid ← (low+high) / 2
if b = key(mid) then
return key(mid)
else if b < key(mid) then
return BinarySearch(a, b, low, mid−1)
else
return BinarySearch(a, b, mid+1, high)
Búsqueda en profundidad
La búsqueda en profundidad primero (o DFS) es un algoritmo para buscar un árbol o una estructura de datos de gráfico no dirigido. Aquí, el concepto es comenzar desde el nodo inicial conocido como elrooty atravesar lo más lejos posible en el mismo ramal. Si obtenemos un nodo sin nodo sucesor, regresamos y continuamos con el vértice, que aún no se ha visitado.
Pasos de la búsqueda en profundidad
Considere un nodo (raíz) que no se visitó anteriormente y márquelo como visitado.
Visite el primer nodo sucesor adyacente y márquelo como visitado.
Si todos los nodos sucesores del nodo considerado ya se han visitado o no tiene más nodos sucesores, regrese a su nodo padre.
Pseudocódigo
Dejar v ser el vértice donde comienza la búsqueda en Graph G.
DFS(G,v)
Stack S := {};
for each vertex u, set visited[u] := false;
push S, v;
while (S is not empty) do
u := pop S;
if (not visited[u]) then
visited[u] := true;
for each unvisited neighbour w of u
push S, w;
end if
end while
END DFS()
Búsqueda primero en amplitud
Breadth-First Search (o BFS) es un algoritmo para buscar un árbol o una estructura de datos de gráficos no dirigida. Aquí, comenzamos con un nodo y luego visitamos todos los nodos adyacentes en el mismo nivel y luego pasamos al nodo sucesor adyacente en el siguiente nivel. Esto también se conoce comolevel-by-level search.
Pasos de la búsqueda primero en amplitud
- Comience con el nodo raíz, márquelo como visitado.
- Como el nodo raíz no tiene ningún nodo en el mismo nivel, pase al siguiente nivel.
- Visite todos los nodos adyacentes y márquelos como visitados.
- Vaya al siguiente nivel y visite todos los nodos adyacentes no visitados.
- Continúe este proceso hasta que se visiten todos los nodos.
Pseudocódigo
Dejar v ser el vértice donde comienza la búsqueda en Graph G.
BFS(G,v)
Queue Q := {};
for each vertex u, set visited[u] := false;
insert Q, v;
while (Q is not empty) do
u := delete Q;
if (not visited[u]) then
visited[u] := true;
for each unvisited neighbor w of u
insert Q, w;
end if
end while
END BFS()
Mejor búsqueda primero
Best-First Search es un algoritmo que atraviesa un gráfico para alcanzar un objetivo en la ruta más corta posible. A diferencia de BFS y DFS, Best-First Search sigue una función de evaluación para determinar qué nodo es el más apropiado para atravesar a continuación.
Pasos de la búsqueda "Mejor primero"
- Comience con el nodo raíz, márquelo como visitado.
- Busque el siguiente nodo apropiado y márquelo como visitado.
- Vaya al siguiente nivel y busque el nodo apropiado y márquelo como visitado.
- Continúe este proceso hasta alcanzar el objetivo.
Pseudocódigo
BFS( m )
Insert( m.StartNode )
Until PriorityQueue is empty
c ← PriorityQueue.DeleteMin
If c is the goal
Exit
Else
Foreach neighbor n of c
If n "Unvisited"
Mark n "Visited"
Insert( n )
Mark c "Examined"
End procedure