Skip to content

Commit 793d453

Browse files
authored
Merge pull request #18 from Rodfc773/feature/Busca-em-largura-BFS
feature: Adicionando a implementação da busca em largura(BFS)
2 parents d694d3b + deff8d1 commit 793d453

File tree

2 files changed

+151
-0
lines changed

2 files changed

+151
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# Breadth First Search
2+
3+
A **Busca em largura** ou do inglês _breadth First Search_ é um algoritmo bastante utilizado para realizar buscas em estruturas de Grafos. Ela é bem parecida com a busca em profundidade(DFS), sendo sua principal diferença a forma como expandimos a busca pelos nós vizinhos em relação ao nó inicial.
4+
5+
Essa expansão ocorre em forma a analoga a uma teia de aranha, em que é visitado primeiro todos os vizinhos do vérice inicial para após isso expandir para os outros vértices(vizinhos dos vizinho).
6+
7+
![Busca em Largura](https://miro.medium.com/v2/resize:fit:1400/1*PvXMyl7PHuW8GAszMlYKZQ.gif)
8+
9+
Fonte do GIF: [Medium](https://medium.com/@anwarhermuche/m%C3%A9todos-de-busca-em-grafos-bfs-dfs-cf17761a0dd9)
10+
11+
## Como funciona
12+
13+
A busca em largura é implementada geralmente na forma interativa e funciona da seguinte maneira:
14+
15+
1. É escolhido um vértice inicial para começar a expansão do grafo, e depedendo do probelma a ser resolvido, também é passado um vértice alvo para a busca.
16+
17+
2. É iniciado uma estrutura de fila com o vértice inicial sendo o seu primeiro elemento.
18+
19+
3. Após a inicialização da fila, é feito a remoção do vértice e se este vértice ainda não foi visitado, ele é marcado como visitado e é obtido uma lista de seus vértices vizinhos.
20+
21+
4. É feito uma iteração na lista de vizinhos e é feito uma checagem para cada vizinho, se este vizinho ainda não foi visitado, ele é adicionado a fila para ser visitado.
22+
23+
5. É feito a repetição dos passos 3 e 4 até que todos os vértices do grafo sejam visitados.
24+
25+
## Código de exemplo
26+
O código a seguir implementa a busca em profundidade tanto recursivamente como iterativamente
27+
```javascript
28+
function BFS(adjMatrix, visited, startVertex) {
29+
const queue = [startVertex];
30+
31+
if (startVertex >= adjMatrix.length) {
32+
console.log("The Adjency Matrix don't contain that start vertex");
33+
return -1;
34+
}
35+
36+
while (queue.length > 0) {
37+
let v = queue.shift();
38+
39+
if (!visited[v]) {
40+
visited[v] = true;
41+
42+
const neighboors = adjMatrix[v];
43+
44+
console.log(`the vertex ${v + 1} is being visited`);
45+
46+
for (let neighboor of neighboors) {
47+
if (!visited[neighboor]) {
48+
queue.push(neighboor);
49+
}
50+
}
51+
}
52+
}
53+
console.log('All vertex were visited');
54+
}
55+
56+
function fillVisitedArray(booleanArray, length) {
57+
for (let idx = 0; idx < length; idx++) {
58+
booleanArray.push(false);
59+
}
60+
61+
return booleanArray;
62+
}
63+
64+
const adjMatrix = [[1, 4, 2], [5, 3], [3, 6], [1, 2, 4], [0, 3], [1], [2]];
65+
66+
const visited = fillVisitedArray([], adjMatrix.length);
67+
68+
BFS(adjMatrix, visited, 0);
69+
70+
```
71+
72+
## Explicação do código
73+
74+
* __Matriz de adjacência__: A matriz ```adjMatrix``` representa o Grafo e suas conexões, sendo cada linha da matriz um vértice de 0 á 6 e cada coluna, os vizinhos que compõem as arestas de cada vértice.
75+
76+
77+
* __Função__: A Função **DFS** recebe 3 paramêtros:
78+
79+
- ```adjMatrix```: A matriz de adjacência que representa um Grado G qualquer.
80+
- ```visited```: uma lista de vértices visitados
81+
- ```startVertex```: O vértice que será realizada a expansão da DFS.
82+
83+
O algorimto irá visitar todos os vérices do grafo, porém so irá expandir a busca para aqueles que ainda não foram visitados, dando prioridade para os vizinhos do vértice atual.
84+
85+
* __Saída__: A saída padrão para este código é a descoberta de todos vértices do grafo, conforme a seguinte exemplo de saída do console:
86+
87+
```
88+
the vertex 0 is being visited
89+
the vertex 1 is being visited
90+
the vertex 4 is being visited
91+
the vertex 2 is being visited
92+
the vertex 5 is being visited
93+
the vertex 3 is being visited
94+
the vertex 6 is being visited
95+
96+
All vertex were visited
97+
98+
````
99+
100+
## Complexidade de tempo:
101+
102+
A complexidade de tempo da busca em profundidade é __O(V+E)__, onde __V__ , ou seja ela tem um complexidade de tempo linear em função di total de vértices e o total de arestas do grafo.
103+
104+
## Quando usar busca por profundidade?
105+
106+
* Em problemas pode ser modelado em encontrar o menor caminho de um grafo não ponderado.
107+
108+
* Em problemas de exploração de grafos ou redes.
109+
110+
* Achar uma árvore geradora minima(MST) e problemas de busca em labirintos.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
function BFS(adjMatrix, visited, startVertex) {
2+
const queue = [startVertex];
3+
4+
if (startVertex >= adjMatrix.length) {
5+
console.log("The Adjency Matrix don't contain that start vertex");
6+
return -1;
7+
}
8+
9+
while (queue.length > 0) {
10+
let v = queue.shift();
11+
12+
if (!visited[v]) {
13+
visited[v] = true;
14+
15+
const neighboors = adjMatrix[v];
16+
17+
console.log(`the vertex ${v} is being visited`);
18+
19+
for (let neighboor of neighboors) {
20+
if (!visited[neighboor]) {
21+
queue.push(neighboor);
22+
}
23+
}
24+
}
25+
}
26+
console.log('All vertex were visited');
27+
}
28+
29+
function fillVisitedArray(booleanArray, length) {
30+
for (let idx = 0; idx < length; idx++) {
31+
booleanArray.push(false);
32+
}
33+
34+
return booleanArray;
35+
}
36+
37+
const adjMatrix = [[1, 4, 2], [5, 3], [3, 6], [1, 2, 4], [0, 3], [1], [2]];
38+
39+
const visited = fillVisitedArray([], adjMatrix.length);
40+
41+
BFS(adjMatrix, visited, 0);

0 commit comments

Comments
 (0)