Topologisk sorteringsalgoritm: Python, C++ Exempelvis
โก Smart sammanfattning
Topologisk sortering ordnar noderna i en riktad acyklisk graf sรฅ att varje nod visas fรถre de den pekar pรฅ, med hjรคlp av Kahns algoritm fรถr att upprepade gรฅnger vรคlja noder med noll ingrad.

Vad รคr topologisk sorteringsalgoritm?
Topologisk sortering รคr รคven kรคnd som Kahns algoritm och รคr en populรคr sorteringsalgoritm. Med hjรคlp av en riktad graf som indata, sorterar Topologisk sortering noderna sรฅ att var och en visas fรถre den den pekar pรฅ.
Denna algoritm tillรคmpas pรฅ en DAG (Directed Acyclic Graph) sรฅ att varje nod visas i den ordnade arrayen fรถre alla andra noder som den pekar pรฅ. Algoritmen fรถljer vissa regler upprepade gรฅnger tills sorteringen รคr klar.
Fรถr att fรถrenkla, titta pรฅ fรถljande exempel:
Regisserad graf
Hรคr kan vi se att "A" inte har nรฅgon ingrad. Ingrad betyder kanten som pekar mot en nod. "B" och "C" har en fรถrutsรคttning fรถr "A", sedan har "E" en fรถrutsรคttning fรถr noder "D" och "F". Vissa av noderna รคr beroende av andra noder.
Hรคr รคr en annan representation av grafen ovan:
Beroende av varje nod (linjรคr ordning)
Sรฅ nรคr vi skickar DAG (Directed Acyclic Graph) till den topologiska sorteringen, kommer det att ge oss en array med linjรคr ordning, dรคr det fรถrsta elementet inte har nรฅgot beroende.
Sรฅ hรคr gรถr du:
Steg 1) Hitta noden med noll inkommande kanter, en nod med noll grader.
Steg 2) Lagra den noll-i-grader-noden i en kรถ eller stack och ta bort noden frรฅn grafen.
Steg 3) Ta sedan bort den utgรฅende kanten frรฅn den noden. Detta minskar antalet grader fรถr nรคsta nod.
Topologisk ordning krรคver att grafens datastruktur inte har nรฅgon cykel. En graf betraktas som en DAG om den uppfyller dessa krav:
- En eller flera noder med indegree-vรคrdet noll.
- Grafen innehรฅller ingen cykel.
Sรฅ lรคnge det finns noder i grafen och grafen fortfarande รคr en DAG, kommer vi att kรถra de tre stegen ovan. Annars kommer algoritmen att hamna i det cykliska beroendet, och Kahns algoritm kommer inte att kunna hitta en nod med noll in-grad.
Hur topologisk sortering fungerar
Hรคr kommer vi att anvรคnda "Kahns algoritm" fรถr den topologiska sorteringen. Lรฅt oss sรคga att vi har fรถljande graf:
Hรคr รคr stegen fรถr Kahns algoritm:
Steg 1) Berรคkna graden eller inkommande kant fรถr alla noder i grafen.
Obs:
- Indegree betyder de riktade kanterna som pekar mot noden.
- Outgrade betyder de riktade kanterna som kommer frรฅn en nod.
Hรคr รคr ingraden och outgraden fรถr grafen ovan:
Steg 2) Hitta noden med noll ingrader eller noll inkommande kanter. Noden med noll ingrader betyder att inga kanter kommer mot den noden. Nod "A" har noll ingrader, vilket betyder att det inte finns nรฅgon kant som pekar mot nod "A". Sรฅ vi kommer att gรถra fรถljande:
- Ta bort denna nod och dess utgรฅende kanter (outgrade kanter).
- Placera noden i kรถn fรถr bestรคllning.
- Uppdatera antalet grader i grannnoden till "A".
Steg 3) Vi behรถver hitta en nod med ett indegree-vรคrde pรฅ noll. I det hรคr exemplet har "B" och "C" noll indegree. Hรคr kan vi ta endera av dessa tvรฅ. Lรฅt oss ta "B" och ta bort det frรฅn grafen. Sedan uppdatera indegree-vรคrdena fรถr andra noder. Efter att ha utfรถrt dessa operationer kommer vรฅr graf och kรถ att se ut sรฅ hรคr:
Steg 4) Noden "C" har ingen inkommande kant. Sรฅ vi tar bort noden "C" frรฅn grafen och lรคgger den i kรถn. Vi kan ocksรฅ ta bort kanten som รคr utgรฅende frรฅn "C". Nu kommer vรฅr graf att se ut sรฅ hรคr:
Steg 5) Vi kan se att noderna "D" och "F" har ingraden noll. Vi tar en nod och lรคgger den i kรถn. Lรฅt oss fรถrst ta bort "D". Dรฅ blir ingradantalet fรถr nod "E" 1. Nu kommer det inte att finnas nรฅgon nod frรฅn D till E. Vi behรถver gรถra detsamma fรถr nod "F", och vรฅrt resultat blir fรถljande:
Steg 6) Ingraden (ingรฅende kanter) och utgraden (utgรฅende kanter) fรถr noden "E" blev noll. Sรฅ vi har uppfyllt alla fรถrutsรคttningar fรถr noden "E". Hรคr placerar vi "E" i slutet av kรถn. Sรฅ vi har inga noder kvar, och algoritmen slutar hรคr.
Pseudo Code fรถr topologisk sortering
Hรคr รคr pseudokoden fรถr den topologiska sorteringen med Kahns algoritm.
function TopologicalSort( Graph G ): for each node in G: calculate the indegree start = Node with 0 indegree G.remove(start) topological_list = [start] while node with 0 indegree present: topological_list.append(node) G.remove(node) // Update indegree of present nodes return topological_list
Topologisk sortering kan ocksรฅ implementeras med hjรคlp av DFS (Djup fรถrsta sรถkning) metod. Det tillvรคgagรฅngssรคttet รคr dock den rekursiva metoden. Kahns algoritm รคr mer effektiv รคn DFS-metoden.
C++ Implementering av topologisk sortering
#include<bits/stdc++.h> using namespace std; class graph{ int vertices; list<int> *adjecentList; public: graph(int vertices){ this->vertices = vertices; adjecentList = new list<int>[vertices]; } void createEdge(int u, int v){ adjecentList[u].push_back(v); } void TopologicalSort(){ // filling the vector with zero initially vector<int> indegree_count(vertices,0); for(int i=0;i<vertices;i++){ list<int>::iterator itr; for(itr=adjecentList[i].begin(); itr!=adjecentList[i].end();itr++){ indegree_count[*itr]++; } } queue<int> Q; for(int i=0; i<vertices;i++){ if(indegree_count[i]==0){ Q.push(i); } } int visited_node = 0; vector<int> order; while(!Q.empty()){ int u = Q.front(); Q.pop(); order.push_back(u); list<int>::iterator itr; for(itr=adjecentList[u].begin(); itr!=adjecentList[u].end();itr++){ if(--indegree_count[*itr]==0){ Q.push(*itr); } } visited_node++; } if(visited_node!=vertices){ cout<<"There's a cycle present in the Graph.\nGiven graph is not DAG"<<endl; return; } for(int i=0; i<order.size();i++){ cout<<order[i]<<"\t"; } } }; int main(){ graph G(6); G.createEdge(0,1); G.createEdge(0,2); G.createEdge(1,3); G.createEdge(1,5); G.createEdge(2,3); G.createEdge(2,5); G.createEdge(3,4); G.createEdge(5,4); G.TopologicalSort(); }
Produktion
0 1 2 3 5 4
Python Implementering av topologisk sortering
from collections import defaultdict class graph: def __init__(self, vertices): self.adjacencyList = defaultdict(list) self.Vertices = vertices # No. of vertices # function to add an edge to adjacencyList def createEdge(self, u, v): self.adjacencyList[u].append(v) # The function to do Topological Sort. def topologicalSort(self): total_indegree = [0]*(self.Vertices) for i in self.adjacencyList: for j in self.adjacencyList[i]: total_indegree[j] += 1 queue = [] for i in range(self.Vertices): if total_indegree[i] == 0: queue.append(i) visited_node = 0 order = [] while queue: u = queue.pop(0) order.append(u) for i in self.adjacencyList[u]: total_indegree[i] -= 1 if total_indegree[i] == 0: queue.append(i) visited_node += 1 if visited_node != self.Vertices: print("There's a cycle present in the Graph.\nGiven graph is not DAG") else: print(order) G = graph(6) G.createEdge(0,1) G.createEdge(0,2) G.createEdge(1,3) G.createEdge(1,5) G.createEdge(2,3) G.createEdge(2,5) G.createEdge(3,4) G.createEdge(5,4) G.topologicalSort()
Produktion
[0, 1, 2, 3, 5, 4]
Cykliska grafer fรถr topologisk sorteringsalgoritm
En graf som innehรฅller en cykel kan inte vara topologiskt ordnad, eftersom den cykliska grafen har beroendet pรฅ ett cykliskt sรคtt. Se till exempel denna graf:
Denna graf รคr inte en DAG (Directed Acyclic Graph) eftersom A, B och C skapar en cykel. Om du mรคrker det finns det ingen nod med noll i grader. Enligt Kahns algoritm, om vi analyserar grafen ovan:
- Hitta en nod med noll grader (inga inkommande kanter).
- Ta bort den noden frรฅn grafen och skicka den till kรถn. I grafen ovan finns det dock ingen nod med noll grader i tum. Varje nod har ett grader i tum som รคr stรถrre รคn 0.
- Returnera en tom kรถ, eftersom den inte kunde hitta nรฅgon nod med noll in-grader.
Vi kan upptรคcka cykler med hjรคlp av den topologiska ordningen med fรถljande steg:
Steg 1) Utfรถr topologisk sortering.
Steg 2) Berรคkna det totala antalet element i den topologiskt sorterade listan.
Steg 3) Om antalet element รคr lika med det totala antalet noder, finns det ingen cykel.
Steg 4) Om det inte รคr lika med antalet noder, finns det minst en cykel i den givna grafdatastrukturen.
Komplexitetsanalys av topologisk sort
Det finns tvรฅ typer av komplexitet i algoritmer. De รคr:
- Tidskomplexitet
- Rymdkomplexitet
Dessa komplexiteter representeras med en funktion som ger en generell komplexitet.
Tidskomplexitet: All tidskomplexitet รคr densamma fรถr topologisk sortering. Det finns vรคrsta tรคnkbara, genomsnittliga och bรคsta tรคnkbara scenarier fรถr tidskomplexitet. Tidskomplexiteten fรถr topologisk sortering รคr O(E + V), dรคr E stรฅr fรถr antalet kanter i grafen och V stรฅr fรถr antalet noder i grafen.
Lรฅt oss bryta igenom denna komplexitet:
Steg 1) I bรถrjan kommer vi att berรคkna alla grader. Fรถr att gรถra det mรฅste vi gรฅ igenom alla kanter, och initialt kommer vi att tilldela alla V vertexgrader till noll. Sรฅ de inkrementella stegen vi slutfรถr kommer att vara O(V+E).
Steg 2) Vi kommer att hitta noden med noll gradvรคrde. Vi mรฅste sรถka frรฅn V-talet pรฅ vertexet. Sรฅ, stegen som slutfรถrs kommer att vara O (V).
Steg 3) Fรถr varje nod med noll grader tar vi bort den noden och minskar graden. Att utfรถra denna operation fรถr alla noder kommer att ta O(E).
Steg 4) Slutligen kommer vi att kontrollera om det finns nรฅgon cykel eller inte. Vi kommer att kontrollera om det totala antalet element i den sorterade arrayen รคr lika med det totala antalet noder. Det kommer ta O (1).
Sรฅ, dessa var de individuella tidskomplexiteterna fรถr varje steg i den topologiska sorteringen eller topologiska ordningen. Vi kan sรคga att tidskomplexiteten frรฅn ovanstรฅende berรคkning blir O(V + E); hรคr betyder O komplexitetsfunktionen.
Rymdkomplexitet: Vi behรถvde O(V)-utrymmen fรถr att kรถra den topologiska sorteringsalgoritmen. Hรคr รคr stegen dรคr vi behรถvde utrymmet fรถr programmet:
- Vi var tvungna att berรคkna alla grader av noder som fanns i grafen. Eftersom grafen har totalt V-noder mรฅste vi skapa en array av storlek V. Sรฅ det utrymme som krรคvdes var O (V).
- En kรถdatastruktur anvรคndes fรถr att lagra noden med noll indegree. Vi tog bort noderna med noll indegree frรฅn den ursprungliga grafen och placerade dem i kรถn. Fรถr detta var det utrymme som krรคvdes O (V).
- Matrisen heter "ordning", vilket lagrar noderna i topologisk ordning. Det krรคvde ocksรฅ O (V) utrymmen.
Dessa var de individuella rumskomplexiteterna. Sรฅ vi behรถver maximera dessa rum under kรถrtiden. Rumskomplexitet stรฅr fรถr O(V), dรคr V betyder numret pรฅ noden i grafen.
Tillรคmpning av topologisk sort
Det finns en enorm anvรคndning fรถr topologisk sortering. Hรคr รคr nรฅgra av dem:
- Den anvรคnds nรคr en Operatingssystem behรถver utfรถra resurstilldelningen.
- Hitta en cykel i grafen. Vi kan validera om grafen รคr en DAG eller inte med topologisk sortering.
- Meningsordning i apparna fรถr automatisk komplettering.
- Den anvรคnds fรถr att upptรคcka dรถdlรคgen.
- Olika typer av schemalรคggning eller kursschemalรคggning anvรคnder topologisk sortering.
- Att lรถsa beroenden. Om du till exempel fรถrsรถker installera ett paket kan det paketet ocksรฅ behรถva andra paket. Topologisk ordning tar reda pรฅ alla nรถdvรคndiga paket fรถr att installera det aktuella paketet.
- Linux anvรคnder den topologiska sorteringen i "apt" fรถr att kontrollera paketens beroende.











