1.什么是图?
- 图是网络结构的抽象模型,是一组由边连接的节点
- 图是一种与树结构相似的数据结构
- JS中没有图,但是可以用Object和Array构建图
- 图的表示形式有邻接矩阵,邻接表
2.常用操作
- 广度优先遍历
- 深度优先遍历
3.代码示例
创建一个邻接表
const graph = {
0: [1,2],
1: [2],
2: [0,3],
3: [3]
};
module.exports = graph;
深度优先遍历
const graph = require('./graph');
//存储已经访问过的元素
const visited = new Set();
const dfs = (n) => {
console.log(n);
visited.add(n);
graph[n].forEach(c => {
if(!visited.has(c)) {
dfs(c);
}
})
}
dfs(2);
广度优先遍历
const graph = require('./graph');
const visited = new Set();
visited.add(2); //2是根节点
const q = [2];
while(q.length) {
const n = q.shift();
console.log(n);
graph[n].forEach(c => {
if(!visited.has(c)) {
q.push(c);
// 防止把重复元素添加到队列中
visited.add(c);
}
})
}
4.LeetCode
接下来使用图这个数据结构来刷LeetCode有关图的题目,巩固提升对图的了解。
题号65.有效数字(困难)
题目要求:
解题思路:
构建一个表示状态的图,遍历字符串,并沿着图走,如果到了某个节点无路可走就返回false
关键点在于构建邻接表,以及通过邻接表访问元素是否存在
编写代码:
/**
* @param {string} s
* @return {boolean}
*/
var isNumber = function(s) {
//构建状态图
const graph = {
//通过空可以走到状态0,通过+/-可以走到状态1,通过‘.’可以走到状态2,通过数字可以走到状态'6'
0: {'blank':0, 'sign': 1, '.': 2, 'digit': 6},
1: {'digit':6, '.':2},
2: {'digit': 3},
3: {'digit': 3, 'e':4 ,'E': 4},
4: {'digit': 5, 'sign': 7 },
5: {'digit': 5},
6: {'digit': 6, '.': 3, 'e': 4 , 'E': 4},
7: {'digit': 5}
};
let state = 0;
for(c of s.trim()) {
if(c >= '0' && c <= '9' ) {
c = 'digit';
} else if (c === ' ') {
c = 'blank';
} else if (c === '+' || c === '-') {
c = 'sign';
} else if (c === 'e') {
c = 'e'
} else if (c === 'E') {
c = 'E'
}
state = graph[state][c];
if(state === undefined) {
return false;
}
}
if(state === 3 || state === 5 || state === 6) {
return true;
}
return false;
};
复杂度分析
- 时间复杂度:O(n) 字符串的长度
- 空间复杂度:O(1) 创建的邻接表