◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
欢迎来到全面的图表世界!如果您是一名开发人员,并且术语“图表”只会让人想起饼图和条形图的图像,那么请准备好扩展您的视野。从数据结构的角度来看,图是许多复杂的计算机科学问题和现实世界应用背后的无名英雄。从社交网络和推荐引擎到寻找从 a 点到 b 点的最短路径,图表可以做到这一切。本指南将涵盖从基础知识到高级图形算法的所有内容。系好安全带;这将是一次充满知识、幽默和代码片段的疯狂之旅,让您成为 java 图形大师!
其核心,图是由边连接的节点(顶点)的集合。与可能是线性的平均数据结构(如数组或链表)不同,图表允许更复杂的关系。
图 ggg 定义为 g=(v,e)g = (v, e)g=(v,e) 其中:
考虑一个代表友谊的简单图表:
立即学习“Java免费学习笔记(深入)”;
图可以是有向图或无向图。在有向图中,如果爱丽丝指向鲍勃,请想象爱丽丝说:“嘿鲍勃,我关注你,但你不关注我。”
二维数组 adj[i][j]adj[i][j]adj[i][j] 用于以下位置:
如果节点 i 和 j 之间有边,则 adj[i][j]=1adj[i][j] = 1adj[i][j]=1。
ii
jj
adj[i][j]=weightadj[i][j] = weightadj[i][j]=权重(如果图表已加权)。
优点:
快速查找:o(1) 检查边是否存在。
o(1)o(1)
非常适合密集图形。
缺点:
int[][] adjmatrix = new int[n][n]; // n is the number of vertices // add an edge between vertex 1 and 2 adjmatrix[1][2] = 1;
一个数组或列表,其中每个索引 iii 保存连接到顶点 iii 的节点列表。非常适合稀疏图。
优点:
缺点:
查找边是否存在需要 o(n)。
o(n)o(n)
list<list<integer>> adjlist = new arraylist<>(); for (int i = 0; i < n; i++) { adjlist.add(new arraylist<>()); } // add an edge between vertex 1 and 2 adjlist.get(1).add(2);
所有边的简单列表。每条边都表示为一对(或加权图的三元组)。
优点:
缺点:
list<edge> edges = new arraylist<>(); edges.add(new edge(1, 2, 10)); // edge from 1 to 2 with weight 10
广度优先搜索 (bfs):
时间复杂度:o(v+e)。
o(v+e)o(v + e)
void bfs(int start) { queue<integer> queue = new linkedlist(); boolean[] visited = new boolean[n]; // n = number of vertices queue.add(start); visited[start] = true; while (!queue.isempty()) { int node = queue.poll(); system.out.println(node); for (int neighbor : adjlist.get(node)) { if (!visited[neighbor]) { queue.add(neighbor); visited[neighbor] = true; } } } } </integer>
深度优先搜索 (dfs):
时间复杂度:o(v+e)。
o(v+e)o(v + e)
void dfs(int node, boolean[] visited) { if (visited[node]) return; visited[node] = true; System.out.println(node); for (int neighbor : adjList.get(node)) { if (!visited[neighbor]) { dfs(neighbor, visited); } } }
非常适合像“到特定类型节点的最短距离”这样有多个起点的问题。
对于处理无向图中的连通分量和循环检测功能强大。
动态规划可以与图遍历相结合,优化重复子问题的解决方案。
用于通过知情猜测(启发式)进行寻路。与 dijkstra 类似,但优先考虑靠近目的地的路径。
如果您已经完成了这一步,那么恭喜您!您不仅在图表的疯狂之旅中幸存下来,而且还为自己配备了解决遇到的任何与图表相关的问题的知识。无论您是编码竞赛迷、算法爱好者,还是只是想通过数据结构课程的人,本指南都涵盖了您所需的一切。
请记住,在图表的世界中,如果您迷路了,只需返回本指南即可!
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。