Zgodnie z moim rozumowaniem, obliczyłem złożoność czasową algorytmu Dijkstra jako notacji big-o, używając poniższej listy rozgraniczenia. Nie wyszło tak, jak powinno, i to doprowadziło mnie do zrozumienia go krok po kroku.Zrozumienie Obliczanie złożoności czasu dla algorytmu Dijkstra
- Każdy wierzchołek może być połączony z wierzchołkami (V-1), a więc liczba przylegających krawędzi dla każdego wierzchołka wynosi V - 1. Załóżmy, E oznacza V-1 krawędzie połączone z każdym wierzchołku.
- Wyszukiwanie & Aktualizowanie masy każdego sąsiedniego wierzchołka w sterty min wynosi O (log (V)) + O (1) lub
O(log(V))
. - W związku z tym, od kroku 1 i kroku 2 powyżej, złożoność czasowa dla aktualizacji wszystkich sąsiednich wierzchołków wierzchołka to E * (logV). lub
E*logV
. - Stąd złożoność czasowa dla wszystkich wierzchołków V wynosi V * (E * logV), tj.
O(VElogV)
.
Ale złożoność czasowa dla algorytmu Dijkstra to O (ElogV). Czemu?
dziękuję, masz swój punkt, sąsiednieEdges * totalVertices = totalEdges (E). ale czy możesz rzucić nieco światła na to, co naprawdę oznacza bardziej ścisła granica/szacunek. –
@MeenaChaudhary, a dokładniej 'maxAdjacentEdgesOfAVertex * totalVertices> = totalEdges', i to daje mocniejsze ograniczenie. Ściślejsza granica oznacza szacunek bliższy prawdy. Na przykład, jeśli algorytm wykonuje operacje "n + 10", możesz powiedzieć, że jest to 'O (n^2)', które jest prawdziwe, lub 'O (nlogn)', które jest również prawdziwe. Ale to również "O (n)", które jest bardziej zwarte niż te dwa pozostałe. Najmniejszy możliwy związek nazywa się 'Θ', więc w powyższym przykładzie' n + 1 = Θ (n) '. (Definicja 'Θ' jest tym, co jest górną i dolną granicą) – Shahbaz
@Shahbaz Dla jasności, masz na myśli' E * log [2] (V) ', (log z base 2), poprawne? Co wynika z założenia binarnej kupy, która pomaga śledzić różne rzeczy? – SeldomNeedy