图的实现和特性

面试中较少出现。

Graph(V, E)

V - vertex:点

  • 度 - 入度和出度
  • 点与点之间:连通与否

E - edge:边

  • 有向和无向(单行线)
  • 权重(边长)

表示方法:连接矩阵、邻接表,都是二维的数据结构。

无向无权图:矩阵是对称的矩阵,以中间的主对角线进行对称。

有向无权图:矩阵不再是对称的矩阵

无向有权图:矩阵是对阵的矩阵,值为权重

递归写法:BFS、DFS

// BFS const bfs = (root) => { const visited = new Set(); const queue = [root]; visited.add(root); while (queue.length) { const n = queue.shift(); console.log(n); graph[n].forEach(c => { if (!visited.has(c)) { queue.push(c); visited.add(c); } }); } }
// DFS const dfs = (n) => { console.log(n); visited.add(n); graph[n].forEach(c => { if (!visited.has(c)) { dfs(c); } }); }

图的高级算法

连通图个数: https://leetcode-cn.com/problems/number-of-islands/

// 连接图个数 /** * @param {character[][]} grid * @return {number} */ var numIslands = function(grid) { let count = 0; for (let i = 0; i < grid.length; i++) { for (let j = 0; j < grid[0].length; j++) { if (grid[i][j] === '1') { count++; trunZero(i, j, grid); } } } return count; }; // 访问过的结点置为 0 function trunZero (i, j, grid) { if ( i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] === '0' ) return; grid[i][j] = '0'; trunZero(i, j + 1, grid); trunZero(i, j - 1, grid); trunZero(i + 1, j, grid); trunZero(i - 1, j, grid); }

拓扑排序(Topological Sorting): https://zhuanlan.zhihu.com/p/34871092

最短路径(Shortest Path):Dijkstra https://www.bilibili.com/video/av25829980?from=search&seid=13391343514095937158

最小生成树(Minimum Spanning Tree): https://www.bilibili.com/video/av84820276?from=search&seid=17476598104352152051