数据结构与算法-图的深度优先遍历【十六】

对于图的遍历,也分为深度优先遍历与广度优先遍历。

深度优先遍历:找到它的邻接点,然后选择一条路走到黑,直到遇到已经遍历过的节点,那么回退,不然一直往下面走。

还是以之前的这个邻接矩阵为例:
在这里插入图片描述

以这个邻接矩阵为例:

图的定义:

  
  function Graph(vexs = [], arcs = []) {
      this.vexs = vexs
      this.arcs = arcs
  }

vexs 存储了4个顶点:

const vexs= [ 'A', 'B', 'C', 'D']

arcs是一个二维数组,长这样:

const arcs=
   [
     [0, 1, 1, 0],
     [1, 0, 1, 1],
     [1, 1, 0, 1],
     [0, 1, 1, 0]
   ]

初始化这个图:

  var graph = new Graph(vexs, arcs);

深度优先遍历

需要一个辅助的数组 或者 map来记录这个节点是否被访问过。

/**
graph 图
v     第v个节点
*/
// 辅助数组
let visited = []
function dfs(graph, v = 0) {
	
	// 从节点A开始
	console.log(`当前访问的是第${v}个节点:`, graph.vexs[v])
	visited[v] = true
    // 相当于按照行遍历这个矩阵
	for (let i = 0; i < graph.vexs.length; i++) {
	    if (graph.arcs[v][i]!==0 && visited[i]!==true) {
	    	dfs(graph, i)
	    }
	}

}


时间复杂度分析:

邻接矩阵来表示图:
如果n个顶点,实际上是遍历了整个矩阵,所以时间复杂度是O(n^2)

邻接表来表示图:
如果n个顶点,2e条边(表节点),但是可以改良为邻接多重表/十字链表,实际上遍历e个节点,也能完成,所以时间复杂度是O(n+e)

结论:

稠密图更适合在邻接矩阵上进行深度遍历。
稀疏图更适合在邻接表上进行深度遍历。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值