基于Javascript对象实现图表示

图的基础介绍

  1. 邻接表
    在这里插入图片描述

邻接表的优势是占用内存小,尤其是和邻接居中相比

  1. 邻接矩阵
    在这里插入图片描述

邻接表使用二维数组进行表示,0和1表示二者存在连接,且是双向的;如果需要换成有权图,仅仅需要将1换成其他数字即可,比如10,14,这些数字可以代表特定的含义,比如长度,代价,关联程度

使用javascript的对象来简化图的实现

实现前的考虑

1) 邻接表是每个顶点和多个值相关联,多个值如何存储呢? 最简单的就是数组;
2) 如何将一个值直接映射到该数组呢,答案就是对象的键值对组合。
3) 综合起来,就是使用对象的属性存储每个顶点,然后属性对应的值存储数组,也就是和他们相连接的其他顶点。

代码

/*
    利用js对象的属性实现edge: 无向图
         this.vertexes = {
            "vertex1":[],
            "vertex2": [],
            ......
         }
    基于js对象的各种图的表示: 
        1) 有权图: 每个属性存储一个元素为对象的数组
            {
                A : [ {elment:elment, weigh: 100 }, {elment:elment2, weigh: 22},...... ]
                B : [{},{},....]
            }
        2) 有向图:
            添加direct属性或者其他即可
 
*/
function Graph(){

    // 用来保存节点及其他们的相邻顶点
    this.vertexes = {}

    Graph.prototype.addVertex = function (v){
        // 顶点已经存在
        if(this.vertexes.hasOwnProperty(v)){
            return false
        }
        //为对象设置属性,值为空: 相当于创造了节点,但是没有和其他节点进行关联
        this.vertexes[v] = [] 
    }
    // 注意:创建的是无向边,应该是互相的连接的
    Graph.prototype.addEdge = function (v1,v2){
        // 任何一个节点不存在,直接返回false
       if(this.vertexes[v1]===undefined || this.vertexes[v2]===undefined){
           return false
       }
        // 无向图
        this.vertexes[v1].push(v2)
        this.vertexes[v2].push(v1)
    }   
}

测试

    let graph = new Graph()
    graph.addVertex("A")
    graph.addVertex("B")
    graph.addVertex("C")

    graph.addEdge("A","B")
    graph.addEdge("B","C")
    graph.addVertex("D")
    graph.addEdge("C","D")
    
    console.log(graph.vertexes);

在这里插入图片描述
在这里插入图片描述
图的其他方法

使用js对象来实现图之后,其他诸如查找、遍历等方法就很容易实现啦

如何实现其他类型的图呢?

实现其他诸如有权图,可以考虑在数组里面存储对象,即 “key” : [ {weight: 100 ,vertex: " D"}, {…} ]
其他的就自由发挥了

总结
使用javascript对象来实现对邻接表的模拟,不仅易懂,而且在代码层面实现起来极其简单,一改图结构实现的噩梦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值