Contenido del artículo
Búsqueda de la primera y respiración
El árbol
Un diagrama de árboles para ilustrar la búsqueda de la primera y respiración es el siguiente:
Para buscar un nodo, el algoritmo comienza con el nodo raíz 1 y luego al nodo 2, nodo 3, etc. Nivel por nivel, de arriba a abajo, de izquierda a derecha, hasta que se encuentra con el nodo que está buscando.
Almacenando el árbol
Un árbol es como un gráfico simple. En este artículo, el árbol se almacena utilizando una lista de adyacencia. Una lista de adyacencia indica un nodo (vértice) y todos sus nodos adyacentes (vértices), como sigue, en el diagrama anterior:
Un borde
Un borde es la línea que une un vértice y un vértice adyacente. También se puede considerar como un par, compuesto por un vértice (nodo) y un vértice adyacente (nodo adyacente). Entonces, el árbol anterior tiene los siguientes bordes para los vértices correspondientes:
Estructura de C ++
La información anterior se puede almacenar en un vector C ++ de vectores. Cada fila comienza con un nodo, seguido de sus nodos adyacentes. El vector de vectores C ++, para el árbol anterior es el siguiente:
vectorvtr = 1, 2, 3, 4,
2, 1, 5, 6,
3, 1,
4, 1, 7, 8,
5, 2, 9, 10,
6, 2,
7, 4, 11, 12,
8, 4,
9, 5,
10, 5,
11, 7,
12, 7;
Breve nota sobre la complejidad del tiempo
Considere el siguiente código:
int n = 10;
para (int i = 0; icout << i << ", ";
La salida es:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Suponiendo que la declaración de cout es una operación simple, se dice que la complejidad del tiempo (velocidad) para este bucle es O (n), donde n en este caso es 10. El Big O seguido de entre paréntesis con N es la notación para la complejidad del tiempo (velocidad). Considere el siguiente código:
int n = 10;
para (int i = 0; i<7; i++)
cout << i << ", ";
La salida es:
0, 1, 2, 3, 4, 5, 6,Aunque n es 10, no se imprimen hasta 10 elementos (se han impreso 7 elementos). Todavía se dice que la complejidad del tiempo es o (n). Es el número máximo posible de operaciones lo que se tiene en cuenta.
Considere el siguiente código:
int n = 10;
int m = 10;
para (int i = 0; icout << i << ", ";
cout << endl;
para (int i = 0; icout << i << ", ";
cout << endl;
La salida es:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Hay dos bucles para 10 variables cada una, para n y m. Se dice que la complejidad del tiempo (velocidad) es: O (N + M). Incluso si la salida es:
0, 1, 2, 3, 4, 5, 6La complejidad del tiempo todavía se da como o (n + m). Es el número máximo posible de operaciones lo que se tiene en cuenta. Además, si la salida es:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Por convención, la complejidad del tiempo todavía se da como o (n + m).
Buscando un vértice mediante la primera búsqueda
Wikipedia.Org da el algoritmo de la siguiente manera:
Continúa diciendo que la complejidad del tiempo es:
O (| V | + | E |)Donde | V | es el número de vértices (nodos) y | E | es el número de bordes.
Si la estructura para el árbol se da como un vector de vectores, como en el caso anterior, no habrá necesidad de usar una cola. Simplemente escanee el vector de vectores, de arriba a abajo, hasta que se ve el vértice que se busca. Este procedimiento todavía da la misma complejidad de tiempo de O (| V | + | E |).
Suponga que para el árbol anterior, se debe buscar el vértice 9. Desde la tabla de bordes/nodo rediseñado a continuación, para facilitar el acceso, el número de bordes es 19 y el número de nodos es 9:
3 bordes: 1 adyacente a 2, 3, 4Las operaciones son 9 + 19 = 28. En esta tabla, los bordes se citan a la izquierda y los vértices se citan a la derecha. Nuevamente, es la suma máxima posible la que se considera, es decir: 11 + 21 = 32. Significa que hay once vértices más 21 bordes, que es O (11 + 21), escrito en términos generales como o (| V | + | E |).
El código C ++ para buscar el vértice 9 es:
int contador = 0;
para (sin firmar i = 0; ipara (unsigned j = 0; j contador = contador + 1;
if (vtr [i] [0] == 9)
romper;
cout << counter << endl;
La salida es 28, con un máximo de 32.
Conclusión
La complejidad del tiempo BFS es:
O (| V | + | E |)
Donde | V | es el número de vértices (nodos) y | E | es el número de bordes.