图的基础介绍
- 邻接表
邻接表的优势是占用内存小,尤其是和邻接居中相比
- 邻接矩阵
邻接表使用二维数组进行表示,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对象来实现对邻接表的模拟,不仅易懂,而且在代码层面实现起来极其简单,一改图结构实现的噩梦。