Treść artykułu
Wyszukiwanie oddechowe
Drzewo
Schemat drzewa ilustrujący wyszukiwanie w oddechu jest następujące:
Aby szukać węzła, algorytm zaczyna się od węzła głównego 1, a następnie do węzła 2, węzła 3 itp. Poziom według poziomu, od góry do dołu, od lewej do prawej, dopóki nie spełni węzła, którego szuka.
Przechowywanie drzewa
Drzewo jest jak prosty wykres. W tym artykule drzewo jest przechowywane za pomocą listy sąsiedniej. Lista sąsiedniej wskazuje węzeł (wierzchołek) i wszystkie jego sąsiednie węzły (wierzchołki), jak następuje, na poprzednim schemacie:
Krawędź
Krawędź to linia łącząca wierzchołek i sąsiedni wierzchołek. Można go również uznać za parę, złożoną z wierzchołka (węzeł) i sąsiedniego wierzchołka (sąsiedni węzeł). Tak więc poprzednie drzewo ma następujące krawędzie dla odpowiednich wierzchołków:
Struktura C ++
Poprzednie informacje można przechowywać w wektorze C ++ wektorów. Każdy wiersz zaczyna się od węzła, a następnie jego sąsiednie węzły. Wektor wektora C ++, dla poprzedniego drzewa jest następujący:
wektorvtr = 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;
Krótka uwaga na temat złożoności czasu
Rozważ następujący kod:
int n = 10;
dla (int i = 0; iCout << i << ", ";
Wyjście to:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Zakładając, że instrukcja Cout jest prostą operacją, mówi się, że złożoność czasu (prędkość) dla tej pętli jest O (n), gdzie n w tym przypadku wynosi 10. Duża O, a następnie wsporniki z N jest notacja złożoności czasu (prędkość). Rozważ następujący kod:
int n = 10;
dla (int i = 0; i<7; i++)
Cout << i << ", ";
Wyjście to:
0, 1, 2, 3, 4, 5, 6,Chociaż N to 10, nie wydrukowano do 10 elementów (wydrukowano 7 elementów). Wciąż mówi się, że złożoność czasu jest O (n). Jest to maksymalna możliwa liczba operacji, które są brane pod uwagę.
Rozważ następujący kod:
int n = 10;
int m = 10;
dla (int i = 0; iCout << i << ", ";
Cout << endl;
dla (int i = 0; iCout << i << ", ";
Cout << endl;
Wyjście to:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Istnieją dwa w pętli dla 10 zmiennych, dla N i M. Mówi się, że złożoność czasu (prędkość) brzmi: o (n + m). Nawet jeśli wyjście to:
0, 1, 2, 3, 4, 5, 6Złożoność czasu jest nadal podawana jako O (N + M). Jest to maksymalna możliwa liczba operacji, które są brane pod uwagę. Ponadto, jeśli wyjście to:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Zgodnie z konwencją złożoność czasu jest nadal podawana jako O (N + M).
Wyszukiwanie wierzchołka przez wyszukiwanie w oddechu
Wikipedia.Org podaje algorytm w następujący sposób:
Następnie mówi, że złożoność czasu jest:
O (| v | + | e |)Gdzie | v | to liczba wierzchołków (węzłów) i | e | to liczba krawędzi.
Jeśli struktura drzewa jest podana jako wektor wektorów, podobnie jak w poprzednim przypadku, nie będzie potrzeby używania kolejki. Po prostu zeskanuj wektor wektorów, od góry do dołu, aż zobaczy się wierzchołek, który jest szukany. Ta procedura nadal daje złożoność czasu O (| v | + | e |).
Załóżmy, że dla poprzedniego drzewa należy szukać wierzchołka 9. Z tabeli krawędzi/węzłów ponownie przesyłane w następujący sposób, dla łatwego dostępu liczba krawędzi wynosi 19, a liczba węzłów to 9:
3 krawędzie: 1 w sąsiedztwie 2, 3, 4Operacje to 9 + 19 = 28. W tej tabeli krawędzie są cytowane po lewej stronie, a wierzchołki są cytowane po prawej stronie. Ponownie, jest to maksymalna możliwa suma, która jest uwzględniona, to znaczy: 11 + 21 = 32. Oznacza to, że istnieje jedenaście wierzchołków plus 21 krawędzi, czyli O (11 + 21), napisane ogólnie jako O (| v | + | e |).
Kod C ++ do wyszukiwania Vertex 9 to:
int licznik = 0;
dla (unsigned i = 0; idla (unsigned j = 0; j licznik = licznik + 1;
if (vtr [i] [0] == 9)
przerwa;
Cout << counter << endl;
Wyjście to 28, z maksymalnie 32.
Wniosek
Złożoność czasu BFS to:
O (| v | + | e |)
Gdzie | v | to liczba wierzchołków (węzłów) i | e | to liczba krawędzi.