深度和广度优先搜索:如何找出社交网络中的三度好友关系
什么是“搜索”算法?
深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的,图这种数据结构表达能力很强,大部分设计搜索的场景都可以抽象成“图”
在图中找出从一个顶点出发,到另一个顶点的路径。方法有很多,比如深度优先、广度优先,还有A* , IDA*等启发式搜索算法,用邻接表来存储图
public class Graph{ //无向图
private int v; //顶点的个数
private LinkedList<Integer> adj[]; //邻接表
public Graph(int v){
this.v = v;
adj = new LinkedList[v];
for(int i = 0 ; i < v ; ++i){
adj[i] = new LinkedList<>();
}
}
public void addEdge(int s ,int t){ //无向图一条边存两次
adj[s] .add(t);
adj[t].add(s);
}
}
广度优先搜索 BFS
先查找离起始顶点最近的,然后是次近的,依次向外搜索
s表示起始顶点,t是终止顶点,搜索一条从s到t的路径,即就是从s到t的最短路径
visited是用来记录已经被访问的顶点,用来避免顶点被重复访问,如果顶点q被访问,相应的visited[q]被设置为true
quene是一个队列,用来存储已经被访问、但是相连的顶点还没有被访问的顶点。因为广度优先搜索是逐层访问