1.图
- 什么是图?如何用js表示图结构?
- 如何建模解决现实问题?如何用正确的数据结构表示图?
- 如何查找?
2.js如何表示图呢?
书中用的是邻接数组表示,具体就是:数组索引表示该顶点,索引上的值为数组, 存储的是该顶点的相邻顶点。具体如下:
// 既然拿到图,那么如何表示顶点呢?如何表示边呢?如何表示图呢?js如何表示呢?
// 这里的方法是用邻接数组表示的?
function Graph(v) {
this.vertices = v;
this.edges = 0;
this.adj = [];
for (let i = 0; i < this.vertices; i++) {
this.adj[i] = [];
this.adj[i].push('')
}
this.addEdge = addEdge
this.showGraph = showGraph
}
function addEdge(v, w) {
this.adj[v].push(w);
this.adj[w].push(v);
this.edges++;
}
function showGraph() {
for (let i = 0; i < this.vertices; i++) {
console.log(i + ' -> ', this.adj[i]);
for (let j = 0; j < this.vertices; j++) {
if (this.adj[i][j] !== undefined) {
// console.log(this.adj[i][j] + ' ');
}
}
}
}
let g = new Graph(3)
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 2)
g.showGraph()
3.图的查找
表示完图,那么就需要用图去做些事情。就是图的查找。
图的查找有两种搜索:深度优先搜索和广度优先搜索。
(1)深度优先搜索
含义:从某个顶点出发,沿着一条路径开始追溯,直至最后一个顶点,然后回溯。继续追溯下一条路径,直至到达最后的顶点。
应用:通过搜索查看图中有哪些路径可以选择。
深度优先搜索算法代码如下:
let g = new Graph(5)
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 3)
g.addEdge(2, 4)
g.showGraph()
g.dfs(0)
function dfs(v) { // v即为顶点,也即数组邻接表索引(顶点找顶点,找顶点)
this.marked[v] = true;
console.log(`${v}`);
for (let i = 0; i < this.adj[v].length; i++) {
if (this.adj[v][i] !== '' && !this.marked[this.adj[v][i]]) {
this.dfs(this.adj[v][i])
}
}
}
(2)广度优先搜索
含义:从某个顶点出发,先访问靠近它的顶点的所在层,然后逐渐下移到远离它的顶点的层。
实现原理:
(1)查找与当前顶点相邻的未访问顶点,将其添加到已访问顶点列表级队列中。
(2)从已访问顶点列表级队列中取出一个顶点v,查找与其相邻的未访问顶点,添加到已访问的顶点列表中。
(3)如此反复。
// 广度优先搜索
console.log('广度优先搜索==');
function bfs(s) {
const queue = [];
this.marked[s] = true;
queue.push(s);
while (queue.length > 0) {
var v = queue.shift();
if (this.adj[v] !== '') {
console.log(`${v}`);
for (let i of this.adj[v]) {
if (!this.marked[i] && i !== '') {
this.marked[i] = true;
queue.push(i);
}
}
}
}
}