¿Alguien puede dar un enlace para una explicación simple sobre BFS y DFS con su implementación?Búsqueda inicial y profundidad Búsqueda inicial
Respuesta
digamos que se le da la siguiente estructura:
Format: Node [Children] A [B C D] B [E F] C [G] D [] E [] F [] G []
Una búsqueda en anchura visitas todos los hijos de un nodo antes de visitar a sus hijos.Aquí está el pseudocódigo y la solución de la estructura anterior:
1. Enqueue root node. 2. Dequeue and output. If the queue is empty, go to step 5. 3. Enqueue the dequeued node's children. 4. Go to Step 2. 5. Done
Two queues: (Active Node) [Output] [Working Set] Starting with root: () [] [A] (A) [A] [B C D] (B) [A B] [C D E F] (C) [A B C] [D E F G] (D) [A B C D] [E F G] (E) [A B C D E] [F G] (F) [A B C D E F] [G] (G) [A B C D E F G] [] Done
Una primera búsqueda en profundidad visitas al nivel más bajo (los niños más profundas) del árbol primera vez. Hay dos tipos de búsqueda en profundidad: preordenar y postordenar. Esto solo diferencia entre cuando agrega el nodo a la salida (cuando lo visita y lo deja).
var rootNode = structure.getRoot(); var preOrder = new Array(); var postOrder = new Array(); function DepthFirst(rootNode){ // Pre-order preOrder[ preOrder.length ] = rootNode; for(var child in rootNode){ DepthFirst(child); } // Post-order postOrder[ postOrder.length ] = rootNode; }
Pre-order: * A B E F C G D Post-order: * E F B G C D A
Éstos son algunos enlaces de revisar:
BFS es un método de búsqueda desinformados que tiene como objetivo ampliar y examinar todos los nodos de un gráfico o una combinación de secuencias de búsqueda sistemática a través de cada solución. En otras palabras, busca de manera exhaustiva todo el gráfico o la secuencia sin considerar el objetivo hasta que lo encuentra.
Formalmente, DFS es una búsqueda desinformados que progresa mediante la ampliación del primer nodo hijo del árbol de búsqueda que aparece y por lo tanto va más y más hasta un nodo objetivo se encuentra , o hasta que llegue a un nodo que no tiene hijos. Entonces la búsqueda retrocede, volviendo a la más reciente nodo no ha terminado de explorar
No sólo contienen buenas explicaciones sobre la forma en que se implementan en las aplicaciones, sino también un cierto código de pseudo algoritmo.
Digamos que tiene un árbol de la siguiente manera:
alt text http://i40.tinypic.com/289aslh.jpg
Puede ser un poco confuso porque E es a la vez un niño de A y F, pero que ayuda a ilustrar la profundidad en una primera búsqueda en profundidad. Una primera búsqueda en profundidad busca el árbol que va tan profundo (de ahí el término profundidad) como puede hacerlo primero. Por lo tanto, el recorrido de izquierda a derecha sería A, B, D, F, E, C, G.
Una primera búsqueda de amplitud evalúa primero a todos los niños antes de proceder con los hijos de los niños. Así mismo árbol iría A, B, C, E, D, F, G.
Espero que esto ayude.
Eso no es un árbol. Eso es un gráfico acíclico dirigido. –
@ThomasEding tienes razón en que no es un árbol sino erróneo al decir que es un * gráfico acíclico dirigido * (DAG). De hecho, si hubiera sido un * DAG * hubiera sido un * árbol *. Lo que describe aquí es en realidad un ** gráfico cíclico no dirigido **. – Inquisitive
se puede encontrar todo en el wiki:
este link puede ser útil también. si quieres una aplicación vaya a: c++ boost library: DFS
primera búsqueda en profundidad:
Heres la idea en lo básico:
obtener una nueva cola ... inicializar con el nodo raíz .. .. recorra toda la cola y continúe eliminando un elemento de la cola e imprimiéndolo (o guardándolo, etc.) y verifique si el mismo elemento tiene alguna niños, si es así, empújelos a la cola y continúe en el ciclo hasta que recorra todo el segmento (gráfico) ...
fragmento con 2 punteros.
void BFS(int v,struct Node **p)
{
struct Node *u;
visited[v-1] = TRUE;
printf("%d\t",v);
AddQueue(v);
while(IsEmpty() == FALSE)
{
v = DeleteQueue();
u = *(p+v-1);
while(u!=NULL)
{
if(visited(u->data -1) == FALSE)
{
AddQueue(u->data);
visited[u->data -1]=TRUE;
printf("%d\t",u->data);
}
u = u->next;
}
}
}
BFS y DFS son aplicables a todo tipo de gráficos. Lo explico solo para árbol binario. BFS visita cada nodo de arriba a abajo, de izquierda a derecha. Por ejemplo para esto:
1
/\
7 9
\/\
8 2 3
BFS nos da: 1 7 9 8 2 3. DFS visitas profundidad de cada rama primero. Luego, regresa a sus padres. Puedes seguir esta regla informal. Primero dejó al niño, luego a la derecha, luego al padre. Pero, debes comenzar desde la profundidad de cada rama. Por ejemplo, aquí comienza desde 8, ya que no hay ningún niño de la izquierda por 7. Luego, visita al padre 7. Luego, se visitará a uno de los padres de 7. Entonces, vas a la rama derecha. Pero, esta vez hay 2 como el niño más a la izquierda. Entonces, visita 2 (hijo izquierdo), luego hijo derecho 3, luego 9 sus padres. Entonces, DFS nos da 8 7 1 2 9 3. Esta es la implementación:
import java.util.ArrayList;
import java.util.List;
public class TreeTraverse {
static class Node{
Node(int data){
this.data = data;
this.left = null;
this.right = null;
this.visited = false;
}
int data;
Node left;
Node right;
boolean visited;
}
public static void main(String[] args) {
//The tree:
// 1
///\
// 7 9
// \/\
// 8 2 3
Node node1 = new Node(1);
Node node7 = new Node(7);
Node node9 = new Node(9);
Node node8 = new Node(8);
Node node2 = new Node(2);
Node node3 = new Node(3);
node1.left = node7;
node1.right = node9;
node7.right = node8;
node9.right = node3;
node9.left = node2;
System.out.println("DFS: ");
depthFirstSearch(node1);
System.out.println("\nBFS: ");
breadthFirstSearch(node1);
}
private static void depthFirstSearch(Node node){
if(node.left == null && node.right == null){
System.out.print(node.data+" ");
node.visited = true;
}else if(node.left == null || node.left.visited){
depthFirstSearch(node.right);
System.out.print(node.data+" ");
node.visited = true;
}else{
depthFirstSearch(node.left);
node.visited = true;
System.out.print(node.data+" ");
depthFirstSearch(node.right);
}
}
private static void breadthFirstSearch(Node node){
List<Node> al = new ArrayList<>();
al.add(node);
while(!al.isEmpty()){
node = al.get(0);
if(node.left != null){
int index = al.size();
al.add(index,node.left);
}
if(node.right != null){
int index = al.size();
al.add(index,node.right);
}
System.out.print(al.get(0).data+" ");
al.remove(0);
}
}
}
Espero que ayude. Si desea clonar el proyecto, visite: https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java. Espero que ayude.
En primer lugar, BFS y DFS son dos formas de implementar el cruce de árbol binario. Breadth First significa cruce de orden de nivel. Profundidad Primero tiene tres formas de implementar -,,.
Preorder:
a. Start with root,
b. mark it visited,
c. go to left node
d. (b) - mark it visited
e. Repeat (c) till there is not any new left node remaining
(We are/might be at leaf node at this point,)
f. Is there any right node available? If yes, go to (a).
Nivel de orden transversal Tiempo Complejidad O (n) - Número de veces que se visitó cada nodo es 1 solamente, significa total es n veces.
espacio complejidad- Mejor caso: Árbol solamente los nodos de la izquierda, es O (1) Caso media: árbol binario perfecto es ejemplo, n/2 número de nodos, O (n)
- 1. búsqueda inicial de datos backbone.js
- 2. Valores de propiedades de contexto inicial para la búsqueda EJB
- 3. Parámetros de Programación Genética Inicial
- 4. profundización iterativa vs búsqueda en profundidad
- 5. Integridad de la búsqueda en profundidad
- 6. ¿Seguridad web inicial?
- 7. Simulación física inicial
- 8. Erlang: nodo esclavo inicial
- 9. Ruby: cada desplazamiento inicial
- 10. Selección inicial de VoiceOver
- 11. Python subrayado inicial _variables
- 12. Programación incorporada ... muy inicial
- 13. QDockWidget ancho inicial
- 14. MyComputer como directorio inicial
- 15. Django, ModelChoiceField() y el valor inicial
- 16. incompatibles tamaños inicial y máximo especificados montón
- 17. Restablecimiento Highcharts al estado inicial
- 18. ¿Qué usar como versión inicial?
- 19. Configuración SQLAlchemy AutoIncrement valor inicial
- 20. adaptación decaimiento exponencial sin adivinación inicial
- 21. Perl inicial <STDIN>
- 22. Poblar inicial en Django Forms
- 23. valor inicial de un Enum
- 24. Profundidad no recursiva-Primera búsqueda (DFS) Uso de una pila
- 25. ¿Cómo implementar una primera búsqueda de amplitud a cierta profundidad?
- 26. tamaño inicial para el ArrayList
- 27. Buscar "directorio inicial" en Python?
- 28. Posición inicial del divisor NSSplitView
- 29. variable int con cero inicial?
- 30. ¿Hace jQuery algún procesamiento inicial?
¿Tiene esto algo que ver con el xkcd de hoy? :-P – SoapBox
tres tipos. Te perdiste el cruce en orden. – user1031420
'1' es Enqueue nodo raíz,' 2' es Dequeue y salida. Entonces, después de quitar el enrutamiento del nodo raíz en cola, ¿la cola no estará vacía? – anukul