图算法结构

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);
                        }
                    }
                }
            }
        }

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值