前言
- 圖的概念
圖:關(guān)于圖的概念就大概說一下基本的,圖分成有向和無向。圖由若干頂點構(gòu)成,頂點相連成邊,邊由頂點對組成,(假設(shè)有v1,v2兩頂點,(v1,v2)即為一條邊)每個頂點有權(quán)重,對于圖的概念可以自行Google,本文著重對圖的實現(xiàn),上兩張“圖”的例子:
有向圖
無向圖
- 圖的存儲
- 使用鄰接表;
以頂點值為下標(biāo),構(gòu)建數(shù)組,元素為與該頂點相連的頂點值,下面例子就是用鄰接表存儲。假設(shè)有頂點v1、v2、v3,且有邊(v1, v2)、(v1, v3)、(v2, v3)
var edges = [];
edges[v1] = [v2, v3];
edges[v2] = [v1, v3];
edges[v3] = [v1, v2];
?
- 使用鄰接矩陣:
臨界矩陣,簡單說是個二維數(shù)組,假設(shè)有頂點v1、v2,并且v1、v2有邊相連,則用鄰接矩陣表示為:
var edges = [];
edges[v1][v2] = 1;
// 若無邊相連則為
edges[v1][v2] = 0;
?
圖的javascript實現(xiàn)
下面以上文中的無向圖為例
function Graph() {
this.edges = 0;
this.vertices = [];
}
// 初始化頂點
Graph.prototype.initVertices = function(list) {
if(toString.call(list) !== '[object Array]') {
throw new TypeError('please init adj with Array');
}
for(item in list) {
this.vertices[list[item]] = [];
}
};
// 添加頂點的連結(jié)(邊)
Graph.prototype.addEdge = function(v1, v2) {
if(!this.vertices[v1] || !this.vertices[v2]) {
throw new TypeError('vertex that does not exist!');
}
this.vertices[v1].push(v2);
this.vertices[v2].push(v1);
this.edges++;
};
// 輸出存儲圖的鄰接表
Graph.prototype.showGraph = function() {
for(item in this.vertices) {
console.log(item+': ', this.vertices[item].join(','));
}
};
var list = [1,2,3,4,5,6];
var graph = new Graph();
graph.initVertices(list);
graph.addEdge(1, 2);
graph.addEdge(1, 4);
graph.addEdge(1, 5);
graph.addEdge(2, 3);
graph.addEdge(2, 4);
graph.addEdge(2, 5);
graph.addEdge(2, 6);
graph.addEdge(3, 5);
graph.addEdge(3, 6);
graph.addEdge(4, 5);
graph.addEdge(5, 6);
graph.showGraph();
PS:圖當(dāng)然是沒有那么簡單的啦,想了解圖自己去看書吧