Graph 是 Yuka.js 库的深度优先搜索 (DFS) 算法中用到的图形数据结构。
图形数据结构由一组节点(或顶点)和一组边组成。在 Yuka.js 库中,图形使用邻接列表来表示。
邻接列表是无向图或有向图中,每个节点的相邻节点的数据结构列表。在无向图中,邻接列表包含所有相邻的节点,而在有向图中则包含所有从该节点开始的出边或入边。
在 Yuka.js 库中,邻接列表使用 Map 对象实现,键为节点编号,值为相邻节点列表。例如:
const graph = new Map();
graph.set(0, [1, 2, 3]);
graph.set(1, [0, 2]);
graph.set(2, [0, 1]);
graph.set(3, [0]);
上述代码表示一个无向图,每个节点的编号分别为 0,1,2,3。节点 0 与节点 1,2,3 相邻,节点 1 与节点 0,2 相邻,以此类推。
深度优先搜索是一种用于遍历或搜索树或图的算法。在遍历节点时,从一个节点出发,不断地向某个相邻节点移动,直到遇到无法满足条件的节点,然后回溯到上一个节点,继续搜索其他相邻节点,如此往复直到遍历完所有可达的节点。
在 Yuka.js 库中,深度优先搜索算法使用的是递归实现。搜索过程中维护了一个 visitedSet 集合,用于存储已访问过的节点编号。搜索过程中,首先将起点节点加入 visitedSet 集合,然后依次访问当前节点的相邻节点。若相邻节点未被访问过,则递归访问该节点。若相邻节点已访问过,则忽略该节点。如下是 Yuka.js 库中深度优先搜索算法的示例代码:
function dfs(graph, startNode, fn) {
const visitedSet = new Set();
(function traverse(node) {
visitedSet.add(node);
fn(node);
const adjacentNodes = graph.get(node);
for (const adjacentNode of adjacentNodes) {
if (!visitedSet.has(adjacentNode)) {
traverse(adjacentNode);
}
}
})(startNode);
}
在以上代码中,graph 代表邻接列表,startNode 代表起点节点,fn 代表回调函数。函数 traverse 是一个自调函数,通过递归遍历相邻节点。在遍历过程中,从 visitedSet 集合中检查节点是否已被访问过,在遍历完当前节点后,继续递归遍历相邻节点。最终搜索完所有可达节点。
Graph 是 Yuka.js 库深度优先搜索算法中使用的图形数据结构,使用邻接列表表示。深度优先搜索算法使用递归实现,维护 visitedSet 集合记录已访问过的节点。在访问当前节点的相邻节点时,若相邻节点未被访问过,则递归访问该节点。最终遍历完所有可达节点。