BFS java实现_BFS,DFS(Java实现)

本文详细介绍了如何用Java实现BFS(广度优先搜索)和DFS(深度优先搜索)。BFS通过队列按层次遍历图中的顶点,而DFS则能快速找到底部元素。两种算法的时间复杂度均为O(n + e),其中e为图中的边数。文中给出了完整的Java代码示例。
摘要由CSDN通过智能技术生成

BFS 广度优先搜索 (Broadth First Search)

类似于树按层次遍历的过程

要求顺次访问

为了顺次访问路径长度为2、3、…的顶点,需要使用队列记录已访问的顶点

时间复杂度:O(n + e)

e为无向图中边的数或有向图中弧的数

/**

* Broadth First Search

* @param graph 用于存放图中每个结点的邻接表

* key:Character value:该结点的邻接表 LinkedList

* @param map 用于存放每个结点与顶点的距离

* key:Character value:距离

* @param start 起始顶点

*/

public void BFS(HashMap> graph,

HashMap map,

char start) {

Queue q = new LinkedList<>();

q.add(start); //将起始顶点加入队列

map.put(start, 0);

int i = 0;

while (!q.isEmpty()) {

//取出队首元素

char top = q.poll();

i++;

System.out.println("The" + i +"th element: " + top + "Distance from start is: " + map.get(top));

//计算周边未访问过的结点的距离

int distance = map.get(top) + 1;

//访问队首元素结点的邻接表

for (Character c : graph.get(top)) {

//在该邻接表中,如果某元素还没被访问到,说明还未遍历,则访问这个结点

if (!map.containsKey(c)){

map.put(c, distance);

q.add(c);

}

}

}

}

DFS 深度优先搜索 (Depth First Search)

可以快速发现底部元素

时间复杂度:O(n + e)

e为无向图中边的数或有向图中弧的数

static int count = 0;

/**

* Broadth First Search

* @param graph 用于存放图中每个结点的邻接表

* key:Character value:该结点的邻接表 LinkedList

* @param visited 用于存放每个结点与顶点的距离

* key:Character value:距离

* @param start 起始顶点

*/

public void DFS(HashMap> graph,

HashMap visited,

char start) {

visit(graph, visited, 's');

}

private static void visit(HashMap> graph,

HashMap visited,

char start) {

if (!visited.containsKey(start)) {

count++;

//记录进入该结点的时间

System.out.println("The time into element: " + start + ":" + count);

//将该结点标志为已访问

visited.put(start, true);

//访问队首元素结点的邻接表

for (char c : graph.get(start)) {

//递归访问其他邻近结点

if (!visited.containsKey(c)) {

visit(graph, visited, c);

}

}

count++;

System.out.println("The time out element: " + start + ":" + count);

}

}

标签:map,结点,Java,HashMap,graph,DFS,BFS,start,visited

来源: https://blog.csdn.net/DavidSharch/article/details/98056886

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值