深度优先搜索
深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
深度优先搜索有两种方式实现,一种是利用栈先入后出,另一种是递归的方式,不过递归的本质就是在压栈弹出的过程。本案例将使用递归的方式。
nodejs
Node.js是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。
Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
好了对nodejs的介绍就到这里。
图的数据
一共有a,b,c,d,e,f六个顶点
const graph={
a:['c','b'],
b:['d'],
c:['e'],
d:['f'],
e:[],
f:[]
};
定义深度优先搜索算法
//栈方式定义
const depthFirstPrint=(graph,source)=>{
const stack=[source];
while (stack.length>0){
const current =stack.pop();
console.log(current);
for (let neighbor of graph[current]){
stack.push(neighbor)
}
}
};
//递归方式定义
const depthFirstPrint2=(graph,source)=>{
console.log(source)
for (let neighbor of graph[source]){
depthFirstPrint2(graph,neighbor)
}
}
测试结果
可以看到,使用递归遍历图的算法就是这么简单,短短几行就可以写完了。