数据结构(八)图
数据结构(八)图
1. 定义
图是网络结构的抽象模型,是一组由边连接的节点
图分为有向和无向
图可以表示任何二元关系:比如道路、航班……
js中没有图,使用object和array构建图
图的表示法
邻接矩阵:使用二维数组,浪费计算机存储空间,不灵活
邻接表:使用数组、链表、散列表、字典
关联矩阵:二维数组;关联矩阵通常用于边的数量比顶点多的情况,以节省空间和内存
……
2. 具体操作
创建
1 |
|
方法
addVertex(v):添加顶点
1
2
3
4
5
6addVertex(v) {
if (!this.vertices.includes(v)) {
this.vertices.push(v);
this.adjList.set(v, []);
}
}addEdge(v, w):添加边
1
2
3
4
5
6
7
8
9
10
11
12addEdge(v ,w) {
if (!this.adjList.get(v)) {
this.addVertex(v);
}
if (!this.adjList.get(w)) {
this.addVertex(w);
}
this.adjList.get(v).push(w);
if (!this.isDirectedn) {
this.adjList.get(w).push(v);
}
}getVertices():返回顶点列表
1
2
3getVertices() {
return this.vertices;
}getAdjList():返回邻接表
1
2
3getAdjList() {
return this.adjList;
}toString():返回字符串格式
1
2
3
4
5
6
7
8
9
10
11
12toString() {
let s = '';
for (let i = 0; i < this.vertices.length; i++) {
s += `${this.vertices[i]} -> `;
const neighbors = this.adjList.get(this.vertices[i]);
for (let j = 0; j < neighbors.length; j++) {
s += `${neighbors[j]} `;
}
s += '\n';
}
return s;
}
3. 图的遍历
深度优先遍历:尽可能深的搜索图的分支
- 访问根节点
- 对根节点的没访问过的相邻节点挨个进行深度优先遍历
1 |
|
广度优先遍历:先访问离根节点最近的节点
- 新建一个队列,把根节点入队
- 把队头出队并访问
- 把队头的没访问过的相邻节点入队
- 重复二三步,直到队列为空
1 |
|
4. LeetCode题
65.有效数字
解题步骤:
- 构建一个表示状态的图
- 遍历字符串,并沿着图走,如果到了某个节点无路可走就返回false
- 遍历结束后,直到3、5、6,就返回true
1 |
|
417. 太平洋大西洋水流问题
解题思路:
- 把矩阵想象为图
- 从海岸线逆流而上遍历图,所到之处就是可以流到某个大洋的坐标
解题步骤:
- 新建两个矩阵,分别记录能流到两个大洋的坐标
- 从海岸线,多管齐下,同时深度优先遍历图,过程中填充上述矩阵
- 遍历两个矩阵,找出能流到两个大洋的坐标
1 |
|
133. 克隆图
解题步骤:
- 深度或广度优先遍历所有节点
- 拷贝所有的节点,存储起来
- 将拷贝的节点,按照原图的连接方式进行连接
1 |
|
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!