深さ優先アルゴリズムdfs
3808 ワード
転載するhttps://blog.csdn.net/u014394715/article/details/51192293
深さ優先アルゴリズム
定義
深さ優先検索アルゴリズム(英語:Depth-First-Serch、略してDFS)は、ツリーまたは図を巡回または検索するためのアルゴリズムである.ツリーの深さに沿って、ツリーのノードを巡回して、できるだけ深い枝を検索します.ノードvのあるところは全部自分で探されました.検索はノードvを発見する側の起点ノードに遡ります.このプロセスは、ソースノードから到達可能なすべてのノードが発見されるまで進行する.まだ発見されていないノードがある場合、ソースノードとして選択し、上記のプロセスを繰り返し、プロセス全体は、すべてのノードがアクセスされるまで繰り返される.盲目的な捜索に属する.
简単にDFSの思想は一つの顶点V 0から始まり、一つの道に沿ってまっすぐ行って、もし目的解に辿り着けないと発见したら、前のノードに戻り、もう一つの道から最后まで歩く.
深さと広さの比較
カラム:図を検索すると、ツリーの階層によって検索されます.
私たちは、ノードから派生した隣接ノードの平均個数がN個であると仮定して、スタート地点から検索を開始すると、キューにノードがあり、出発点を取り出した後、隣のノードを中に入れると、列にN個のノードがあり、次の階層の検索で要素を列に追加すると、ノード数がN 2に達し、考えられます.いったんNが大きな数になると、この木の層はもっと深いので、この列はメモリ空間が必要になります.
広さ優先検索欠点:ツリーの階層が深く、サブノードの数が多い場合、メモリの消費が非常に深刻である. 利点:最短経路 を見つけることができます.適用範囲:ノードに適用されるサブノードの数が多くなく、ツリーの階層があまり深くない場合. 深さ優先検索
利点:メモリ消費が小さく、広さ優先検索の欠点を克服する.毎回検索する過程のため、各階層は一つのノードを維持するだけです.
短所:最適解を探しにくいですが、解があることだけを探しています.
コード
テスト結果:
深さ優先巡回(再帰):A B C D E F G_H I 深さ優先巡回(再帰的でない):A B C D E F G_H I
深さ優先アルゴリズム
定義
深さ優先検索アルゴリズム(英語:Depth-First-Serch、略してDFS)は、ツリーまたは図を巡回または検索するためのアルゴリズムである.ツリーの深さに沿って、ツリーのノードを巡回して、できるだけ深い枝を検索します.ノードvのあるところは全部自分で探されました.検索はノードvを発見する側の起点ノードに遡ります.このプロセスは、ソースノードから到達可能なすべてのノードが発見されるまで進行する.まだ発見されていないノードがある場合、ソースノードとして選択し、上記のプロセスを繰り返し、プロセス全体は、すべてのノードがアクセスされるまで繰り返される.盲目的な捜索に属する.
简単にDFSの思想は一つの顶点V 0から始まり、一つの道に沿ってまっすぐ行って、もし目的解に辿り着けないと発见したら、前のノードに戻り、もう一つの道から最后まで歩く.
深さと広さの比較
カラム:図を検索すると、ツリーの階層によって検索されます.
私たちは、ノードから派生した隣接ノードの平均個数がN個であると仮定して、スタート地点から検索を開始すると、キューにノードがあり、出発点を取り出した後、隣のノードを中に入れると、列にN個のノードがあり、次の階層の検索で要素を列に追加すると、ノード数がN 2に達し、考えられます.いったんNが大きな数になると、この木の層はもっと深いので、この列はメモリ空間が必要になります.
広さ優先検索
利点:メモリ消費が小さく、広さ優先検索の欠点を克服する.毎回検索する過程のため、各階層は一つのノードを維持するだけです.
短所:最適解を探しにくいですが、解があることだけを探しています.
コード
package Test;
import java.util.Stack;
public class DFSTest {
//
private char[] vertices;
// ( )
private int[][] arcs;
//
private int vexnum;
//
private boolean[] visited;
//
public DFSTest(int[][] arcs,char[] vertices) {
//
vexnum = arcs.length;
//
this.vertices = vertices;
// , false,
visited = new boolean[vexnum];
// ( )
this.arcs = arcs;
}
//
public void visit(int i){
System.out.print(vertices[i] + " ");
}
// i , ,
public void traverse(int i){
// i
visited[i] = true;
//
visit(i);
// i ,
for(int j=0;j s = new Stack();
for(int i=0;i=0 ; j-- ){
// , d
if(arcs[curr][j]==1 && visited[j]==false){
s.add(j);
}
}
}
}while(!s.isEmpty());
}
}
}
public static void main(String[] args) {
char[] vertices = {'A','B','C','D','E','F','G','H','I'};
int[][] arcs ={
{0,1,0,0,0,1,0,0,0}, //A 1
{1,0,1,0,0,0,1,0,1}, //B 1
{0,1,0,1,0,0,0,0,1}, //C 1
{0,0,1,0,1,0,1,1,1}, //D 1
{0,0,0,1,0,1,0,1,0}, //E 1
{1,0,0,0,1,0,1,0,0}, //F 1
{0,1,0,1,0,1,0,1,0}, //G 1
{0,0,0,1,1,0,1,0,0}, //H 1
{0,1,1,1,0,0,0,0,0}, //I 1
};
DFSTest g = new DFSTest(arcs,vertices);
System.out.print(" ( ):");
g.DFSTraverse();
System.out.println();
System.out.print(" ( ):");
g.DFSTraverse2();
}
}
テスト結果:
深さ優先巡回(再帰):A B C D E F G_H I 深さ優先巡回(再帰的でない):A B C D E F G_H I