Hello 算法 1.0.0b1 Java版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 133 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = ? 个结点和 2? 条边,使用 ?(? + ?) 时间。 Figure 9‑8. 邻接表的初始化、增删边、增删顶点 基于邻接表实现图的代码如下所示。细心的同学可能注意到,我们在邻接表中使用 Vertex 结点类来表示顶点, 这样做的原因是: ‧ 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 ‧ 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 因此我们考虑引入顶点类 Vertex ,使得每个顶点都是唯一的对象,此时删除顶点时就无需改动其余顶点 了。 // === File: graph_adjacency_list.java === /* 基于邻接表实现的无向图类 */ class GraphAdjList { // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 Map<Vertex, List<Vertex>> adjList;0 码力 | 186 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Java版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 134 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = ? 个结点和 2? 条边,使用 ?(? + ?) 时间。 Figure 9‑8. 邻接表的初始化、增删边、增删顶点 基于邻接表实现图的代码如下所示。细心的同学可能注意到,我们在邻接表中使用 Vertex 结点类来表示顶点, 这样做的原因是: ‧ 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 ‧ 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 因此我们考虑引入顶点类 Vertex ,使得每个顶点都是唯一的对象,此时删除顶点时就无需改动其余顶点 了。 // === File: graph_adjacency_list.java === /* 基于邻接表实现的无向图类 */ class GraphAdjList { // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 Map<Vertex, List<Vertex>> adjList;0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 Java版存泄露。相较于栈内 存,堆内存的管理和使用需要更谨慎,不恰当的使用可能会导致内存泄露和野指针等问题。 161 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可以将图 ? 抽象地表示 为一组顶点 ? 和一组边 ? 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 ? = {1, 2, 3, 4, 5} ,我们在邻接表中使用 Vertex 节点类来表示 顶点,这样做的原因有: ‧ 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 ‧ 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 ? 的顶 点,则需要遍历整个邻接表,将其中 > ? 的索引全部减 1 ,这样操作效率较低。 ‧ 因此我们考虑引入顶点类 Vertex ,使得每个顶点都是唯 9. 图 hello‑algo.com 170 Map<Vertex, List<Vertex>> adjList; /* 构造方法 */ public GraphAdjList(Vertex[][] edges) { this.adjList = new HashMap<>(); // 添加所有顶点和边 for (Vertex[] edge : edges) { addVertex(edge[0]);0 码力 | 342 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 Java版见的边相连。 每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 第 9 章 图 hello‑algo.com 187 9.1 图 图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 ? = {1, 2, 3, 4, 5} ? 第 9 章 图 hello‑algo.com 195 另外,我们在邻接表中使用 Vertex 类来表示顶点,这样做的原因是:如果与邻接矩阵一样,用列表索引来区 分不同顶点,那么假设要删除索引为 ? 的顶点,则需遍历整个邻接表,将所有大于 ? 的索引全部减 1 ,效率 很低。而如果每个顶点都是唯一的 Vertex 实例,删除某一顶点之后就无须改动其他顶点了。 // === File: graph_adjacency_list 邻接表,key:顶点,value:该顶点的所有邻接顶点 Map<Vertex, List<Vertex>> adjList; /* 构造方法 */ public GraphAdjList(Vertex[][] edges) { this.adjList = new HashMap<>(); // 添加所有顶点和边 for (Vertex[] edge : edges) { addVertex(edge[0]);0 码力 | 378 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 Java版边相连。 每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 第 9 章 图 hello‑algo.com 187 9.1 图 「图 graph」是一种非线性数据结构,由「顶点 vertex」和「边 edge」组成。我们可以将图 ? 抽象地表示为 一组顶点 ? 和一组边 ? 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 ? = {1, 2, 3, 4, 5} 为顶点实例,value 为该顶点的邻接顶点列表(链表)。 另外,我们在邻接表中使用 Vertex 类来表示顶点,这样做的原因是:如果与邻接矩阵一样,用列表索引来区 分不同顶点,那么假设要删除索引为 ? 的顶点,则需遍历整个邻接表,将所有大于 ? 的索引全部减 1 ,效率 很低。而如果每个顶点都是唯一的 Vertex 实例,删除某一顶点之后就无须改动其他顶点了。 // === File: graph_adjacency_list 邻接表,key:顶点,value:该顶点的所有邻接顶点 Map<Vertex, List<Vertex>> adjList; /* 构造方法 */ 第 9 章 图 hello‑algo.com 196 public GraphAdjList(Vertex[][] edges) { this.adjList = new HashMap<>(); // 添加所有顶点和边 for (Vertex[] edge : edges)0 码力 | 376 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b5 Java版边相连。 每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 第 9 章 图 hello‑algo.com 185 9.1 图 「图 graph」是一种非线性数据结构,由「顶点 vertex」和「边 edge」组成。我们可以将图 ? 抽象地表示为 一组顶点 ? 和一组边 ? 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 ? = {1, 2, 3, 4, 5} 在邻接表中使用 Vertex 节点类来表示 顶点,而这样做是有原因的。 1. 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 2. 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 ? 的顶 点,则需要遍历整个邻接表,将其中 > ? 的索引全部减 1 ,这样操作效率较低。 3. 因此我们考虑引入顶点类 Vertex ,使得每个顶点都 顶点,value:该顶点的所有邻接顶点 Map<Vertex, List<Vertex>> adjList; 第 9 章 图 hello‑algo.com 194 /* 构造方法 */ public GraphAdjList(Vertex[][] edges) { this.adjList = new HashMap<>(); // 添加所有顶点和边 for (Vertex[] edge : edges)0 码力 | 376 页 | 30.69 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Java 版连。 每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 第 9 章 图 www.hello‑algo.com 187 9.1 图 图(graph)是一种非线性数据结构,由顶点(vertex)和边(edge)组成。我们可以将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 ? = {1, 2, 3, 4, 5} ? 章 图 www.hello‑algo.com 195 另外,我们在邻接表中使用 Vertex 类来表示顶点,这样做的原因是:如果与邻接矩阵一样,用列表索引来区 分不同顶点,那么假设要删除索引为 ? 的顶点,则需遍历整个邻接表,将所有大于 ? 的索引全部减 1 ,效率 很低。而如果每个顶点都是唯一的 Vertex 实例,删除某一顶点之后就无须改动其他顶点了。 // === File: graph_adjacency_list 邻接表,key:顶点,value:该顶点的所有邻接顶点 Map<Vertex, List<Vertex>> adjList; /* 构造方法 */ public GraphAdjList(Vertex[][] edges) { this.adjList = new HashMap<>(); // 添加所有顶点和边 for (Vertex[] edge : edges) { addVertex(edge[0]);0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.2.0 繁体中文 Java 版連。 每一次的相識與相離,都在這張巨大的網路圖中留下獨特的印記。 第 9 章 圖 www.hello‑algo.com 187 9.1 圖 圖(graph)是一種非線性資料結構,由頂點(vertex)和邊(edge)組成。我們可以將圖 ? 抽象地表示為一 組頂點 ? 和一組邊 ? 的集合。以下示例展示了一個包含 5 個頂點和 7 條邊的圖。 ? = {1, 2, 3, 4, 5} ? 為頂點例項,value 為該頂點的鄰接頂點串列(鏈結串列)。 另外,我們在鄰接表中使用 Vertex 類別來表示頂點,這樣做的原因是:如果與鄰接矩陣一樣,用串列索引來 區分不同頂點,那麼假設要刪除索引為 ? 的頂點,則需走訪整個鄰接表,將所有大於 ? 的索引全部減 1 ,效 率很低。而如果每個頂點都是唯一的 Vertex 例項,刪除某一頂點之後就無須改動其他頂點了。 // === File: graph_adjacency_list 鄰接表,key:頂點,value:該頂點的所有鄰接頂點 Map<Vertex, List<Vertex>> adjList; /* 建構子 */ public GraphAdjList(Vertex[][] edges) { this.adjList = new HashMap<>(); // 新增所有頂點和邊 for (Vertex[] edge : edges) { addVertex(edge[0]);0 码力 | 379 页 | 18.79 MB | 10 月前3
共 8 条
- 1













