招c1驾驶员300元一天辽宁seo推广
招c1驾驶员300元一天,辽宁seo推广,简约大气网站设计欣赏,成都广告设计公司有哪些问题导入
给你一个用户#xff0c;如何找出这个用户的所有三度#xff08;其中包含一度、二度和三度#xff09;好友关系#xff1f;
搜索算法
算法是作用于具体数据结构之上的#xff0c;深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为如何找出这个用户的所有三度其中包含一度、二度和三度好友关系
搜索算法
算法是作用于具体数据结构之上的深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为图这种数据结构的表达能力很强大部分涉及搜索的场景都可以抽象成“图”。
无向图的实现代码每个顶点都是一条链表类似hash表 public class Graph { // 无向图private int v; // 顶点的个数private LinkedListInteger adj[]; // 邻接表public Graph(int v) {this.v v;adj new LinkedList[v];for (int i0; iv; i) {adj[i] new LinkedList();}}public void addEdge(int s, int t) { // 无向图一条边存两次adj[s].add(t);adj[t].add(s);}
}
BFS
广度优先搜索Breadth-First-Search我们平常都简称 BFS。直观地讲它其实就是一种“地毯式”层层推进的搜索策略即先查找离起始顶点最近的然后是次近的依次往外搜索。 代码实现 public void bfs(int s, int t) {if (s t) return;boolean[] visited new boolean[v];visited[s]true;QueueInteger queue new LinkedList();queue.add(s);int[] prev new int[v];for (int i 0; i v; i) {prev[i] -1;}while (queue.size() ! 0) {int w queue.poll();for (int i 0; i adj[w].size(); i) {int q adj[w].get(i);if (!visited[q]) {prev[q] w;if (q t) {print(prev, s, t);return;}visited[q] true;queue.add(q);}}}
}private void print(int[] prev, int s, int t) { // 递归打印s-t的路径if (prev[t] ! -1 t ! s) {print(prev, s, prev[t]);}System.out.print(t );
}
三个重要的辅助变量 visited、queue、prev
visited 是用来记录已经被访问的顶点用来避免顶点被重复访问。如果顶点 q 被访问那相应的 visited[q]会被设置为 true。queue 是一个队列用来存储已经被访问、但相连的顶点还没有被访问的顶点。因为广度优先搜索是逐层访问的也就是说我们只有把第 k 层的顶点都访问完成之后才能访问第 k1 层的顶点。当我们访问到第 k 层的顶点的时候我们需要把第 k 层的顶点记录下来稍后才能通过第 k 层的顶点来找第 k1 层的顶点。所以我们用这个队列来实现记录的功能。prev 用来记录搜索路径。当我们从顶点 s 开始广度优先搜索到顶点 t 后prev 数组中存储的就是搜索的路径。不过这个路径是反向存储的。prev[w]存储的是顶点 w 是从哪个前驱顶点遍历过来的。比如我们通过顶点 2 的邻接表访问到顶点 3那 prev[3]就等于 2。为了正向打印出路径递归地来打印。
分解图 时间复杂度O(E)。
空间复杂度主要在几个辅助变量 visited 数组、queue 队列、prev 数组上。这三个存储空间的大小都不会超过顶点的个数所以空间复杂度是 O(V)
DFS
深度优先搜索Depth-First-Search简称 DFS。最直观的例子就是“走迷宫”。
1、深度优先搜索用的是一种比较著名的算法思想回溯思想。
2、深度优先搜索找出来的路径并不是顶点 s 到顶点 t 的最短路径。 代码实现 boolean found false; // 全局变量或者类成员变量public void dfs(int s, int t) {found false;boolean[] visited new boolean[v];int[] prev new int[v];for (int i 0; i v; i) {prev[i] -1;}recurDfs(s, t, visited, prev);print(prev, s, t);
}private void recurDfs(int w, int t, boolean[] visited, int[] prev) {if (found true) return;visited[w] true;if (w t) {found true;return;}for (int i 0; i adj[w].size(); i) {int q adj[w].get(i);if (!visited[q]) {prev[q] w;recurDfs(q, t, visited, prev);}}
}
空间复杂度O(V)
时间复杂度从面画的看出每条边最多会被访问两次一次是遍历一次是回退。所以图上的深度优先搜索算法时间复杂度是 O(E)E 表示边的个数
总结
社交网络可以用图来表示。这个问题就非常适合用图的广度优先搜索算法来解决因为广度优先搜索是层层往外推进的。第一层是1度好友第二层是2度好友第3层是3度好友。改造一下广度优先搜索代码用一个数组来记录每个顶点与起始顶点的距离非常容易就可以找出三度好友关系。
1、广度优先搜索通俗的理解就是地毯式层层推进从起始顶点开始依次往外遍历。广度优先搜索需要借助队列来实现遍历得到的路径就是起始顶点到终止顶点的最短路径。
2、深度优先搜索用的是回溯思想非常适合用递归实现。换种说法深度优先搜索是借助栈来实现的。在执行效率方面深度优先和广度优先搜索的时间复杂度都是 O(E)空间复杂度是 O(V)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89452.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!