Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 793d453

Browse files
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
Lines changed: 110 additions & 0 deletions
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.
Lines changed: 41 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /