当前位置:网站首页>Lost a few hairs, and finally learned - graph traversal -dfs and BFS
Lost a few hairs, and finally learned - graph traversal -dfs and BFS
2022-07-02 03:39:00 【Road__】
One 、 review
Graph search algorithm is the process of traversing each node in the graph . We classify them according to the order in which their nodes are accessed . Now we will introduce Breadth first traversal (Breadth-first Search abbreviation bfs)、 Depth-first traversal (Depth-first Search abbreviation dfs) . These two algorithms are the basis of graph traversal , It is also commonly used in the preliminary exploration of data and many subsequent graph routing algorithms (Pathfinding Algorithm) Are based on this foundation .
Two 、 Breadth first traversal
3.1 brief introduction
Ergodic graph algorithm BFS Is the most commonly used method .
BFS Is a traversal algorithm , Select a node ( Source or starting node ) Start traversing and traverse the graph layer by layer , To explore neighbor nodes ( Nodes directly connected to the source node ). then , You must move to the next neighbor node .
just as BFS As your name implies , You need to traverse the graph as follows :
- First move horizontally , Access all nodes of the current layer
- Move to the next level
The following picture shows the sequence of traversal :
BFS Of Time complexity by O(V + E), among V It's the number of nodes ,E It's the number of sides .
3.2 Code
public void compute(int startId) {
System.out.println("=========== BFS ===========");
boolean[] visited = new boolean[graphApi.getVertexSize()];
//visited[startId] = true;
List<Integer> currentIds = new ArrayList<>();
currentIds.add(startId);
int depth = 1;
while (currentIds.size() != 0) {
Set<Integer> nextId = new HashSet<Integer>();
System.out.println("depth is " + (depth++) + " neighbors is " + currentIds);
for (Integer id : currentIds) {
if(visited[id]) {
continue;
}
visited[id] = true;
int[] edge = graphApi.getEdge(id);
if (edge != null) {
for (int eId : edge) {
nextId.add(eId);
}
}
}
currentIds.clear();
currentIds.addAll(nextId);
}
System.out.println("");
}
3、 ... and 、 Depth-first traversal
3.1. brief introduction
DFS The algorithm is a recursive algorithm that uses the idea of backtracking . If possible , It involves a detailed search of all nodes , If possible , By backtracking .
ad locum , word backtrack It means that when you move forward and there are no more nodes along the current path , You move backward on the same path to find the node to traverse . All nodes will be accessed on the current path , Until all unreached nodes are traversed , Then choose the next path .
DFS This recursive feature of can be implemented using stack . The basic idea is as follows :
Select a starting node and push all its adjacent nodes onto the stack .
Pop a node from the stack to select the next node to access and push all its adjacent nodes onto the stack . Repeat the process , Until the stack is empty . however , Make sure that the accessed node is marked . This will prevent you from accessing the same node multiple times . If you do not mark the visited node and you visit the same node multiple times , You may fall into an infinite loop .
The following picture shows the sequence of traversal :
DFS Of Time complexity by O(V + E), among V It's the number of nodes ,E It's the number of sides .
3.2. Code implementation
1. Recursive implementation
public void dfs(int i, boolean[] visited, GraphApi graphApi) {
System.out.print(i);
visited[i] = true;
int[] edgeIds = graphApi.getEdge(i);
if (edgeIds == null) {
System.out.print(" -> ");
return;
} else {
System.out.print(" -> ");
}
for (int edgeId : edgeIds) {
if(!visited[edgeId]) {
dfs(edgeId, visited, graphApi);
}
}
}
2. Simulate stack implementation
public void compute(int i, boolean[] visited) {
Stack<Integer> stack = new Stack<>();
// Root node stack
stack.push(i);
visited[i] = true;
while (!stack.isEmpty()) {
Integer id = stack.pop();
System.out.print(id + " -> ");
// Logical processing
int[] edge = graphApi.getEdge(id);
if(edge != null) {
for (int item : edge) {
if(!visited[item]) {
stack.push(item);
visited[item] = true;
}
}
}
}
}
Detailed source code address :
https://github.com/RoadTLife/TGraph
边栏推荐
- 0 foundation how to learn automated testing? Follow these seven steps step by step and you will succeed
- aaaaaaaaaaaaa
- High performance and low power cortex-a53 core board | i.mx8m Mini
- ThreadLocal详解
- Oracle common SQL
- 蓝桥杯单片机省赛第十二届第一场
- The fourth provincial competition of Bluebridge cup single chip microcomputer
- [HCIA continuous update] overview of dynamic routing protocol
- [C Advanced] brother Peng takes you to play with strings and memory functions
- Review materials of project management PMP high frequency examination sites (8-1)
猜你喜欢
Review materials of project management PMP high frequency examination sites (8-1)
MySQL index, transaction and storage engine
[designmode] builder model
In wechat applet, the externally introduced JS is used in xwml for judgment and calculation
Oracle的md5
Getting started with MQ
Kubernetes cluster storageclass persistent storage resource core concept and use
蓝桥杯单片机省赛第十一届第二场
Analyse de 43 cas de réseaux neuronaux MATLAB: Chapitre 42 opérations parallèles et réseaux neuronaux - - opérations parallèles de réseaux neuronaux basées sur CPU / GPU
The first game of the 12th Blue Bridge Cup single chip microcomputer provincial competition
随机推荐
Kotlin基础学习 17
Blue Bridge Cup single chip microcomputer sixth temperature recorder
Basic syntax of unity script (6) - specific folder
数据库文件逻辑结构形式指的是什么
NLog use
Kotlin basic learning 13
FFMpeg AVFrame 的概念.
Introduction to Robotics II. Forward kinematics, MDH method
跳出舒适区,5年点工转型自动化测试工程师,我只用了3个月时间
Analyse de 43 cas de réseaux neuronaux MATLAB: Chapitre 42 opérations parallèles et réseaux neuronaux - - opérations parallèles de réseaux neuronaux basées sur CPU / GPU
The 9th Blue Bridge Cup single chip microcomputer provincial competition
KL divergence is a valuable article
Review materials of project management PMP high frequency examination sites (8-1)
The 7th Blue Bridge Cup single chip microcomputer provincial competition
In wechat applet, the externally introduced JS is used in xwml for judgment and calculation
Gradle foundation | customize the plug-in and upload it to jitpack
[HCIA continuous update] working principle of OSPF Protocol
Download and use of the super perfect screenshot tool snipaste
Account management of MySQL
C # joint halcon out of halcon Environment and various Error Reporting and Resolution Experiences