深さと幅優先探索:ソーシャルネットワークで三度のフレンド関係を見つける方法
「検索」アルゴリズムとは何ですか?
深さ優先探索アルゴリズムや幅優先探索アルゴリズムは、このデータ構造の「マップ」ビューに基づいており、このデータ構造の強い発現している、デザインシーン検索のほとんどは、「マップ」に抽象化することができます
図の頂点、他の頂点へのパスから出発識別する。図隣接テーブルを格納するような深さ優先、幅優先、および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 BFS
外向きの検索まず最寄りの開始頂点から見て、次の最も近い順番にあります
、Sは、開始頂点を表す頂点Tが終了され、T秒からパスを検索し、T秒から最短経路であります
訪問した頂点を繰り返しアクセス頂点を回避するために、アクセスされたレコードに使用される頂点Qがアクセスされた場合、対応する訪問[Q]はtrueに設定されています
queneを格納するためのキューアクセスされているが、頂点に隣接する頂点は、アクセスされていません。層によって幅優先探索層をk層の頂点が完全にアクセスすることができた後にのみアクセス可能ですので、我々はK層の頂点へのアクセスを持っている場合、最初の頂点のk + 1層にアクセスするには、必要がK層を配置します頂点の頂点がK頂点K + 1層の第一の層を通ってくる記録
我々は頂点Tに頂点S、幅優先探索の開始前のレコードの検索パス、前のパスは、アレイに格納されているが、この経路は、逆記憶され、前されるから前駆頂点wの頂点に格納されている[W]例えば、我々は表2の頂点3に隣接する頂点を通るアクセスを持っている、上横切る、PREV [3] = 2
public void bfs(int s ,int t){
if(s == t ) return;
boolean[] visited = new boolean[v];
visited[s] = true;
Quene<Integer> quene = new LinkedList<>();
quene.add(s);
int[] prev = new int[v];
for(int i = 0 ;i < v ;++i){
prev[i] = -1;
}
while(quene.size() != 0){
int w = quene.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;
quene.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+" ");
}
時間の複雑さはO(V)であります
深さ優先探索DFS
深さ優先探索最短経路を見つけるためには、実際には、再帰で実装、バックアイデアをあるパスではありません
私たちは、終端頂点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(E)、Eはエッジの数であります
ユーザーのソーシャルネットワーク上の三度のフレンド関係をどのように見つけますか?
幅優先探索アルゴリズムを用いて、まず、友人一旦、ある出発頂点の頂点に最も近い層を横断する、およびユーザの距離と頂点2、二回目の友人関係、ならびに頂点3辺の数の辺の数を横切りますこれは、3度の友情です