Artikelinhalt
Atem-erste Suche
Der Baum
Ein Baumdiagramm zur Veranschaulichung der atemberaubenden Suche ist wie folgt:
Um nach einem Knoten zu suchen, beginnt der Algorithmus mit dem Stammknoten 1 und dem Knoten 2, Knoten 3 usw. usw. Level nach Ebene von oben nach unten, von links nach rechts, bis er auf den Knoten trifft, nach dem es sucht,.
Den Baum speichern
Ein Baum ist wie eine einfache Grafik. In diesem Artikel wird der Baum unter Verwendung einer Adjazenzliste gespeichert. Eine Adjazenzliste zeigt einen Knoten (Scheitelpunkt) und alle seine benachbarten Knoten (Scheitelpunkte) wie folgt im vorherigen Diagramm an:
Eine Ecke
Eine Kante ist die Linie, die einem Scheitelpunkt und einem angrenzenden Scheitelpunkt verbindet. Es kann auch als Paar betrachtet werden, das aus einem Scheitelpunkt (Knoten) und einem benachbarten Scheitelpunkt (benachbarter Knoten) besteht. Der vorherige Baum hat also die folgenden Kanten für die entsprechenden Eckpunkte:
C ++ Struktur
Die vorherigen Informationen können in einem C ++ - Vektor von Vektoren gespeichert werden. Jede Zeile beginnt mit einem Knoten, gefolgt von ihren angrenzenden Knoten. Der C ++-Vektor der Vektoren für den vorherigen Baum lautet wie folgt:
Vektorvtr = 1, 2, 3, 4,
2, 1, 5, 6,
3, 1,
4, 1, 7, 8,
5, 2, 9, 10,
6, 2,
7, 4, 11, 12,
8, 4,
9, 5,
10, 5,
11, 7,
12, 7;
Kurzer Hinweis zur Zeitkomplexität
Betrachten Sie den folgenden Code:
int n = 10;
für (int i = 0; iCout << i << ", ";
Die Ausgabe ist:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Unter der Annahme, dass die Cout-Anweisung eine einfache Operation ist, soll die Zeitkomplexität (Geschwindigkeit) für diese For-Schleife o (n) sein, wobei n in diesem Fall 10 ist. Das große O gefolgt von Klammern mit n ist die Notation für die Zeitkomplexität (Geschwindigkeit). Betrachten Sie den folgenden Code:
int n = 10;
für (int i = 0; i<7; i++)
Cout << i << ", ";
Die Ausgabe ist:
0, 1, 2, 3, 4, 5, 6,Obwohl N 10 ist, werden bis zu 10 Elemente nicht gedruckt (7 Elemente wurden gedruckt). Die zeitliche Komplexität soll immer noch o (n) sein. Es ist die maximal mögliche Anzahl von Operationen, die berücksichtigt werden.
Betrachten Sie den folgenden Code:
int n = 10;
int m = 10;
für (int i = 0; iCout << i << ", ";
Cout << endl;
für (int i = 0; iCout << i << ", ";
Cout << endl;
Die Ausgabe ist:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Es gibt zwei für Schleifen für jeweils 10 Variablen für N und M. Die Zeitkomplexität (Geschwindigkeit) hier soll: O (N + M) sein. Auch wenn die Ausgabe ist:
0, 1, 2, 3, 4, 5, 6Die zeitliche Komplexität wird immer noch als o (n + m) angegeben. Es ist die maximal mögliche Anzahl von Operationen, die berücksichtigt werden. Auch wenn die Ausgabe ist:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Durch Konvention wird die zeitliche Komplexität immer noch als O (N + M) angegeben.
Suche nach einem Scheitelpunkt von Breath-First Search
Wikipedia.Org gibt den Algorithmus wie folgt an:
Es fährt weiter, dass die Zeitkomplexität lautet:
O (| v | + | e |)Wo | v | ist die Anzahl der Eckpunkte (Knoten) und | e | ist die Anzahl der Kanten.
Wenn die Struktur für den Baum als Vektor der Vektoren angegeben ist, müssen Sie wie im vorherigen Fall keine Warteschlange verwenden. Scannen Sie einfach den Vektor der Vektoren von oben nach unten, bis der gesuchte Scheitelpunkt gesehen wird. Diese Prozedur ergibt immer noch die gleiche Zeitkomplexität von O (| V | + | e |).
Nehmen wir an, dass für den vorherigen Baum der Scheitelpunkt 9 gesucht werden soll. Aus den im Folgenden neu gestalteten Kanten/Knoten-Tabellen beträgt die Anzahl der Kanten 19 und die Anzahl der Knoten 9: 9: 9:
3 Kanten: 1 neben 2, 3, 4Die Operationen sind 9 + 19 = 28. In dieser Tabelle werden die Kanten links und die Eckpunkte rechts zitiert. Auch hier ist es die maximal mögliche Summe, die berücksichtigt wird: 11 + 21 = 32. Dies bedeutet, dass es elf Eckpunkte plus 21 Kanten gibt, nämlich O (11 + 21), allgemein als o (| v | + | e |) geschrieben.
Der C ++ - Code, um nach dem Scheitelpunkt 9 zu suchen, lautet:
int counter = 0;
für (vorzeichenlos i = 0; ifür (unsigned j = 0; J Zähler = Zähler + 1;
if (vtr [i] [0] == 9)
brechen;
Cout << counter << endl;
Der Ausgang beträgt 28 mit maximal 32.
Abschluss
Die BFS -Zeitkomplexität lautet:
O (| v | + | e |)
Wo | v | ist die Anzahl der Eckpunkte (Knoten) und | e | ist die Anzahl der Kanten.