Cache-Friendly Design in Robot Path Planningsource, target): for each vertex v in Graph.Vertices: prev[v] ← UNDEFINED # predecessors of v (visited set) create (vertex, vertex, dist) priority queue Q start, 0)) # add start vertex to priority queue while Q is not empty: (p,u,dist_u) ← Q.extract_min() # remove next best vertex (u) and its predecessor of (u) if u is target: # end if we are at the target vertex break for each neighbor v of u with prev[v] is UNDEFINED: dist_v ← dist_u + Graph0 码力 | 216 页 | 10.68 MB | 6 月前3
generic graph librariesgraph from starting vertex S 。Find all vertices reachable on an edge from s (level 1) *。Find all unvisited vertices reachable on an edge from those while (! done) { = visited vertex { for v in neighbors(u) visit Adjacency-List Algorit BFS(G, 9) hms Enumerate vertices 1 for each vertex ET(G) “Vertex 2 color[u] 二 WHITE - ww 3 color[sl bfs(conat Grapht graph,vertex_id_tsource) { sing vertex_id_type = vertex_id_t ; Enumerate atd: :vector color(size(graph)) -一 Vertices for (vertex_id_type u = 0i u < size(graph); 0 码力 | 76 页 | 6.59 MB | 6 月前3
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 Python版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 127 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = self.add_vertex(val) # 添加边 # 请注意,edges 元素代表顶点索引,即对应 vertices 元素索引 for e in edges: self.add_edge(e[0], e[1]) def size(self) -> int: """ 获取顶点数量 """ return len(self.vertices) def add_vertex(self, val: self.adj_mat.append(new_row) # 在邻接矩阵中添加一列 for row in self.adj_mat: row.append(0) def remove_vertex(self, index: int) -> None: """ 删除顶点 """ if index >= self.size(): raise IndexError() # 在顶点列表中移除索引0 码力 | 186 页 | 15.69 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.0b1 Python版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 126 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = vertices: self.add_vertex(val) # 添加边 # 请注意,edges 元素代表顶点索引,即对应 vertices 元素索引 for e in edges: self.add_edge(e[0], e[1]) def size(self): """ 获取顶点数量 """ return len(self.vertices) def add_vertex(self, val): self.adj_mat.append(new_row) # 在邻接矩阵中添加一列 for row in self.adj_mat: row.append(0) def remove_vertex(self, index): """ 删除顶点 """ if index >= self.size(): raise IndexError() # 在顶点列表中移除索引 index 的顶点0 码力 | 178 页 | 14.67 MB | 1 年前3
Hello 算法 1.0.0b1 C++版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 134 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = 我们在邻接表中使用 Vertex 结点类来表示顶点, 这样做的原因是: ‧ 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 ‧ 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 ? 的顶点, 则需要遍历整个邻接表,将其中 > ? 的索引全部执行 −1 ,这样操作效率太低。 ‧ 因此我们考虑引入顶点类 Vertex ,使得每个顶点都是 public: // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 unordered_map<Vertex*, vector<Vertex*>> adjList; /* 在 vector 中删除指定结点 */ void remove(vector<Vertex*> &vec, Vertex *vet) { for (int i = 0; i < vec.size(); i++) { if0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 134 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = 我们在邻接表中使用 Vertex 结点类来表示顶点, 这样做的原因是: ‧ 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 ‧ 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 ? 的顶点, 则需要遍历整个邻接表,将其中 > ? 的索引全部执行 −1 ,这样操作效率太低。 ‧ 因此我们考虑引入顶点类 Vertex ,使得每个顶点都是 public: // 邻接表,key: 顶点,value:该顶点的所有邻接顶点 unordered_map<Vertex*, vector<Vertex*>> adjList; /* 在 vector 中删除指定结点 */ void remove(vector<Vertex*> &vec, Vertex *vet) { for (int i = 0; i < vec.size(); i++) { if0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b1 Golang版堆化操作用于修复堆的特性,在入堆和出堆操作中都会使用到。 ‧ 输入 ? 个元素并建堆的时间复杂度可以被优化至 ?(?) ,非常高效。 135 9. 图 9.1. 图 「图 Graph」是一种非线性数据结构,由「顶点 Vertex」和「边 Edge」组成。我们可将图 ? 抽象地表示为一 组顶点 ? 和一组边 ? 的集合。例如,以下表示一个包含 5 个顶点和 7 条边的图 ? = {1, 2, 3, 4, 5} ? = 我们在邻接表中使用 Vertex 结点类来表示顶点, 这样做的原因是: ‧ 如果我们选择通过顶点值来区分不同顶点,那么值重复的顶点将无法被区分。 ‧ 如果类似邻接矩阵那样,使用顶点列表索引来区分不同顶点。那么,假设我们想要删除索引为 ? 的顶点, 则需要遍历整个邻接表,将其中 > ? 的索引全部执行 −1 ,这样操作效率太低。 ‧ 因此我们考虑引入顶点类 Vertex ,使得每个顶点都是 顶点,value:该顶点的所有邻接顶点 adjList map[Vertex][]Vertex } /* 构造方法 */ func newGraphAdjList(edges [][]Vertex) *graphAdjList { g := &graphAdjList{ adjList: make(map[Vertex][]Vertex), } // 添加所有顶点和边 for _, edge0 码力 | 190 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0 C语言版边相连。 每一次的相识与相离,都在这张巨大的网络图中留下独特的印记。 第 9 章 图 hello‑algo.com 192 9.1 图 「图 graph」是一种非线性数据结构,由「顶点 vertex」和「边 edge」组成。我们可以将图 ? 抽象地表示为 一组顶点 ? 和一组边 ? 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 ? = {1, 2, 3, 4, 5} 为顶点实例,value 为该顶点的邻接顶点列表(链表)。 另外,我们在邻接表中使用 Vertex 类来表示顶点,这样做的原因是:如果与邻接矩阵一样,用列表索引来区 分不同顶点,那么假设要删除索引为 ? 的顶点,则需遍历整个邻接表,将所有大于 ? 的索引全部减 1 ,效率 很低。而如果每个顶点都是唯一的 Vertex 实例,删除某一顶点之后就无须改动其他顶点了。 // === File: graph_adjacency_list struct AdjListNode { Vertex *vertex; // 顶点 第 9 章 图 hello‑algo.com 201 struct AdjListNode *next; // 后继节点 } AdjListNode; /* 查找顶点对应的节点 */ AdjListNode *findNode(GraphAdjList *graph, Vertex *vet) { for (int0 码力 | 390 页 | 17.63 MB | 1 年前3
共 196 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20













