我正在學習拓撲排序和一般圖形。我使用DFS實現了一個版本,但我無法理解爲什麼維基百科頁面顯示這是O(| V | + | E |)並分析它的時間複雜度,以及| V | + | E |和一般n^2。首先,我有兩個for循環,邏輯表示它會是(n^2),但是在任何DAG(或樹)中都有n-1個邊和n個頂點?這與n^2有什麼不同,如果我們可以刪除「-1」爲非顯着值?如何分析DAG時間複雜性?
graph = {
1:[4, 5, 7],
2:[3,5,6],
3:[4],
4:[5],
5:[6,7],
6:[7],
7:[]
}
from collections import defaultdict
def topological_sort(graph):
ordered, marked = [], defaultdict(int)
while len(ordered) < len(graph):
for vertex in graph:
if marked[vertex]==0:
visit(graph, vertex, ordered, marked)
return ordered
def visit(graph, n, ordered, marked):
if marked[n] == 1:
raise 'Not a DAG'
marked[n] = 1
for neighbor in graph.get(n):
if marked[neighbor]!=2:
visit(graph, neighbor, ordered, marked)
marked[n] = 2
ordered.insert(0, n)
def main():
print(topological_sort(graph))
main()
對於其他人沒有注意到它們的初始化:https://en.wikipedia.org/wiki/Directed_acyclic_graph –
它是'O(| V | + | E |)',因爲每個節點都被訪問過一次,每個邊都被訪問一旦。如果一個節點被訪問兩次,它不會是一個DAG,因爲會有一個循環 –