Um das 15Puzzle-Problem zu verstehen, habe ich etwas über die Suche in der Tiefe und die Suche nach der Breite er erfahren. Lassen Sie uns zunächst die Tiefensuche (DFS) diskutieren. Der Zweck der Tiefe-First besteht darin, die Suche nach Pfaden zu priorisieren, die am weitesten vom Startscheitel vom Startscheitel entfernt sind, während die Suche nach Breite zuerst nach Pfaden sucht, die dem Startscheitel am nächsten stehen. Ich frage mich, was der Unterschied zwischen Tiefen-First-Suche und Backtracking ist. Auf Baidu wird gesagt, dass Backtracking eine Art tiefe Suche ist, aber der Unterschied besteht darin, dass Backtracking den Suchbaum nicht beibehält. Was ist also mit der Breitlichkeit zuerst Search (BFS)? Was sind ihre Anwendungen? Antwort: Der kürzeste Weg, das Problem der Weinabteilung, acht digitale Probleme usw. Unter diesen wird die tiefe Suche mithilfe von Graph + Stack implementiert und die breite Suche wird mithilfe von Graph + Warteschlange implementiert. Der Code ist wie folgt:
1. Erstellen Sie einen neuen KlassennodirectionGraph, der "ungerichtete Graph" darstellt
Paket com.wly.algorithmbase Eckrices private int nvertex; // Die Anzahl der derzeit gespeicherten Scheitelpunkte öffentlicher Nodirectiongraph (int maxSize) {mmaxSize = maxSize; vertexlist = new Graphvertex [mmaxSize]; J = 0; j <mmaxSize; j ++) {für (int k = 0; k <mmaxSize; k ++) {indicatOrmat [j] [k] = 0;}}} public void addvertex (Graphvertex v) {if (nvertex <mmaxsize) {v; {System.out.println ("--- Insertion fehlgeschlagen, die Anzahl der Eckpunkte hat die obere Grenze erreicht!");}}/*** Die Adjazenzmatrix ändern und einen neuen Rand hinzufügen* @param start* @param end*/public void addiert (int start, inend) {{{{{start] [start] [$] [end] [end] = 1; Adjazenzmatrix*/public void printindicatormat () {für (int [] Zeile: indicatOmat) {für (int i: line) {system.out.print (i + "");} System.out.println ();}}/*** Tiefe Priorität, die die Punkte -Abtriebs -Abtriebs -Abtriebs -Verschiebung des Vertex -Index darstellt, die Ausgangspriorität, die die Ausgangsprise, die. Adjazenzmatrix des Diagramms */public void dfs (int vertexindex) {ArrayStack Stack = new ArrayStack (); // 1. Fügen Sie das Suchelement der Stack -Vertexlist [vertexindex] hinzu. while (! stapel oder GetNextvertexIndex (int Spalte) {für (int i = 0; i <indicatOrt [Spalte] .Length; i ++) {if (indicatOrt [Spalte] [i] == 1 &&! Vertexlist [i] .ISSISED ()) {return i;}}}} -1;}/** ** *** breadth -first traversal Traverse, dh die Anzahl der Zeilen in der Adjazenzmatrix des Graphen*/public void bfs (int vertexindex) {chainQueue queue = new chainQueue (); Vertexlist [vertexindex] .setvised (true); Queue.insert (new Queuenode (vertexindex); GetNextvertexIndex (VertexIndex); while (! queue.isempty ()) {if (NextvertexIndex! GetNextvertexIndex (queue.peek (). Data); queue.printelems ();}}}}}2. Dann gibt es einen ArrayStack, der mit einem Array simuliert wird
Paket com.wly.algorithmbase.datastructure;/***Verwenden Sie Arrays, um Stapelstruktur zu implementieren. Erstellen Sie generisches Array ***/tarray = new int [CAPACY_STEP];}/***Methode zum Pop -Up Top -Element*@return*/public int pop () {if (isempty ()) {System.out.println ("Fehler, das Element im Stapel ist leer, kann nicht pop"); return -1;} else {int i = tarray [topIndex]; tarray [topIndex--] = -1; // Das Pop-Element return i;}}/*** Fügen Sie ein Element in den Stapel ein. int [tarray.length + capacity_step]; für (int i = 0; i <tarray.length; i ++) {temparray [i] = tarray [i];} tarray = temparray; temparray = null;} else {topIndex ++; Tarray [topIndex] = t;}}/** * Get to Top Element das Element des Top -Elements, aber das Stapel, aber es gibt nicht popup * @return */to -poce (), aber das Stapel, aber es ist nicht popup * @return */tace (the totrelin the poted the poted the popup {if (isempty ()) {System.out.println ("Fehler, das Element im Stapel ist leer, kann nicht peek"); void printelems () {für (int i = 0; i <= topIndex; i ++) {System.out.print (Tarray [i]+"");} System.out.println ();}}}3.. Kettenqueue in einer mit verknüpften Listen simulierten Warteschlange
Paket com.wly.algorithmbase Neuer Knoten zum Schwanz der Warteschlange*/public void Insert (QueueNode -Knoten) {// Natürlich können Sie dies auch schreiben. Knoten;} Größe ++;}/*** Entfernen Sie den Warteschlangenkopfknoten*/public QueueNode remove () {if (! isempty ()) {QueueNode temp = head; head = head.prev; Größe-; Warteschlange leer * * @return */public boolean isEmpty () {if (size> 0) {return false;} else {return true;}}/** * RECHTEN SIE DEN ERSTEN NODE der Warteschlangen {System.out.println (); System.out.println ("Ausnahmebetrieb, die aktuelle Warteschlange ist leer!"); null) {System.out.print (tempnode.data + ""); tempnode = tempnode.prev;} system.out.println ();}}/** * Node -Klasse * * @Author wly * */class QueueNode {Queuenode prev; queuenode prev. Data;} public int getData () {return data;} public void setData (int data) {thata.data = data;}@override public String toString () {// todo automatisch generierte Methode Stub Super.toString ();4. Test test_bfs_dfs
Paket com.wly.algorithmbase.search; import com.wly.algorithmbase args) {// Testdaten nodeirectiongraph Graph = new nodeirectiongraph (7); graph.addvertex (neuer Graphvertex ("A"); Graph.Addvertex (neuer Graphvertex ("B"); Graph.Addvertex (New Graphvertex ("C"). Graphvertex ("e")); graph.addvertex (neuer graphvertex ("f"); graph.addvertex (neuer graphvertex ("g"); graph.adDedge (0, 1); graph.addge (0, 2); graphedge (1, 3); Graph.addge (1, 4); Graph. 5); System.out.println ("-benachbarte Matrix des Graphs-"); Graph.printindicatOrt (); // Testen Sie das Deep-Suchsystem.OUT.println ("-Deep Priority Search-"); Graph.DFS (0); Graph = New Nodirectiongraphen (7); Graph.Addvertex (new gravhvertex ("neuer (New Graphvertex (New Graphvertex (") ("New Graphvertex (" NEW Graphvertex ("A."); Graphvertex ("b")); graph.addvertex (neuer graphvertex ("c")); graph.addvertex (neuer graphvertex ("d"); graph.addvertex (neuer graphvertex ("e"); graph.addvertex (neuer graphvertex ("f"); craph.addvertex (neuer graphvertex ("f"); craph.addvertex (neuer graphvertex ("f"); Graphvertex ("g")); graph.adDedge (0, 1); graph.adDedge (0, 2); graph.adDedge (1, 3); graph.adDedge (1, 4); graph.adDedge (3, 6); Graph.AdDedge (2, 5);Die hier getestete Grafikstruktur lautet wie folgt:
Die Betriebsergebnisse sind wie folgt:
--Adjacent matrix of graph-- 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Hier müssen wir die laufenden Ergebnisse der tiefen Suche und der breiten Suche oben erklären, wobei 0, 1, 2, 3 ... A, B, C, D entspricht ... es ist ein bisschen verwirrend, bitte vergib mir ~~ ~~
Oh ~~~
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels über die Implementierung der Java-Programmierung von graphbasierten Tiefen-First-Such- und Breite-First-Suche vollständigen Code. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!