topological sort (tsz. topological sorts)
A topological sort (topologikus rendezés) egy irányított gráf (DAG – Directed Acyclic Graph) csúcspontjainak olyan lineáris sorrendbe állítása, amelyben minden él irányát figyelembe vesszük. Ez azt jelenti, hogy ha van egy él , akkor a csúcs megelőzi -t a rendezésben.
Topologikus rendezést olyan függőségi viszonyokat tartalmazó problémákban alkalmazunk, ahol a tevékenységeket vagy eseményeket sorrendbe kell állítani:
Topologikus sorrend csak akkor létezik, ha a gráf irányított és körmentes (DAG). Ha kör van benne, akkor nem létezik olyan sorrend, ami megfelel az élirányoknak.
Adott egy irányított gráf , a topologikus sorrend olyan permutáció , ahol:
Ha nem dolgoztunk fel az összes csúcsot, akkor ciklus van.
from collections import deque, defaultdict
def kahn_topological_sort(graph):
indegree = {u: 0 for u in graph}
for u in graph:
for v in graph:
indegree += 1
queue = deque( == 0])
topo_order =
while queue:
u = queue.popleft()
topo_order.append(u)
for v in graph:
indegree -= 1
if indegree == 0:
queue.append(v)
if len(topo_order) != len(graph):
raise ValueError("A ciklus miatt nincs topologikus sorrend.")
return topo_order
def dfs_topological_sort(graph):
visited = set()
topo_order =
def dfs(u):
visited.add(u)
for v in graph:
if v not in visited:
dfs(v)
topo_order.append(u)
for u in graph:
if u not in visited:
dfs(u)
return topo_order # fordított sorrend
Adott egy gráf:
A → C B → C C → D D → E
Lehetséges topologikus sorrendek:
A, B, C, D, E
B, A, C, D, E
Terület | Példa |
---|---|
Ütemezés | Feladatfüggőségek |
Build rendszerek | Fordítási sorrend (pl. make )
|
Fordítási sorrend | Fordítási sorrend a nyelvfordítóban |
Adatcsővezeték | Moduláris adatfeldolgozás |
Kurzus-előfeltétel | Kurzusok teljesítési sorrendje |
Tulajdonság | Érték |
---|---|
Adatstruktúra | Irányított gráf (DAG) |
Cél | Csúcsok sorrendbe állítása, hogy minden él iránya megmaradjon |
Módszerek | Kahn (BFS), DFS |
Komplexitás | |
Feltétel | Csak körmentes irányított gráfra létezik |
Alkalmazás | Fordítás, ütemezés, függőség-kezelés |