Silně souvislé orientované komponenty
Rozdělte orientovaný graf do 64 vrcholů na silně souvislé komponenty.
def strong_components(graph):
if type(graph) is not list or len(graph) > 64:
raise ValueError("scc.graph")
n = len(graph)
if any(type(row) is not set or any(type(v) is not int or not 0 <= v < n for v in row) for row in graph):
raise ValueError("scc.edge")
seen, order = set(), []
for start in range(n):
if start in seen:
continue
seen.add(start)
stack = [(start, iter(sorted(graph[start])))]
while stack:
node, edges = stack[-1]
target = next(edges, None)
if target is None:
order.append(node)
stack.pop()
elif target not in seen:
seen.add(target)
stack.append((target, iter(sorted(graph[target]))))
reverse = [set() for _ in graph]
for node, edges in enumerate(graph):
for target in edges:
reverse[target].add(node)
seen, result = set(), []
for start in reversed(order):
if start in seen:
continue
group, pending = [], [start]
seen.add(start)
while pending:
node = pending.pop()
group.append(node)
for target in reverse[node]-seen:
seen.add(target)
pending.append(target)
result.append(sorted(group))
return sorted(result)
Před použitím zkontrolujte
Porovnejte skutečné chování s očekávaným výsledkem. Pokud kontrola selže, před dalšími změnami zjistěte příčinu.
Modely
Nastavte endpoint kompatibilní s OpenAI nebo Anthropic pomocí základní URL a případného API klíče. Otestujte připojení. Lokální server modelu musí běžet; vzdálené nástroje mohou data odesílat samostatně.
Projekt
Otestujte cykly, osamocené vrcholy a prázdný graf, odmítněte chybné členy bez změny množin sousednosti.
def strong_components(graph):
if type(graph) is not list or len(graph) > 64:
raise ValueError("scc.graph")
n = len(graph)
if any(type(row) is not set or any(type(v) is not int or not 0 <= v < n for v in row) for row in graph):
raise ValueError("scc.edge")
seen, order = set(), []
for start in range(n):
if start in seen:
continue
seen.add(start)
stack = [(start, iter(sorted(graph[start])))]
while stack:
node, edges = stack[-1]
target = next(edges, None)
if target is None:
order.append(node)
stack.pop()
elif target not in seen:
seen.add(target)
stack.append((target, iter(sorted(graph[target]))))
reverse = [set() for _ in graph]
for node, edges in enumerate(graph):
for target in edges:
reverse[target].add(node)
seen, result = set(), []
for start in reversed(order):
if start in seen:
continue
group, pending = [], [start]
seen.add(start)
while pending:
node = pending.pop()
group.append(node)
for target in reverse[node]-seen:
seen.add(target)
pending.append(target)
result.append(sorted(group))
return sorted(result)
Dejte skupinám závislostí význam využitelný aplikací
ComponentWisp je programovací prostředí s AI pro Windows pro vývojáře sledující vztahy v projektových datech a kódu. Do konverzace přineste reprezentaci grafu i příjemce, který potřebuje jeho skupiny. Před návrhem změny seskupování nechte asistenta prozkoumat význam orientované hrany. Výsledek je užitečný jen tehdy, když zachované vztahy odpovídají otázce, na kterou aplikace hledá odpověď.
Úloha kolem strong_components.py může zkoumat skupiny, jejichž vrcholy jsou navzájem dosažitelné orientovanými cestami. Pomocí malého příkladu závislostí odlište vzájemnou dosažitelnost od jednosměrného spojení a poté posuďte implementaci a pořadí výstupu. Používáte-li kód pro závislosti, výslovně určete mapování skutečných objektů na vrcholy; samotná pomocná funkce nemůže stanovit význam těchto závislostí.
Po přečtení návrhu spusťte kontroly projektu s cyklem, jednosměrným spojením a izolovanými vrcholy. Prozkoumejte příjemce a potvrďte konzistentní zacházení s výslednými skupinami. ComponentWisp se připojuje k podporovaným koncovým bodům kompatibilním s OpenAI nebo ke koncovým bodům Anthropic, podle potřeby s přihlašovacími údaji. Neomezené modely lze vybrat tam, kde jsou nabízeny; omezení, nástroje a limity kontextu určuje model a server. Ponechte význam hran a očekávané skupiny v konverzaci, aby další úpravy zachovaly stejný softwarový požadavek.
Otázky ke kódu seskupování závislostí
Stačí jednosměrná závislost ke spojení objektů do skupiny?
Ne u skupiny definované vzájemnou orientovanou dosažitelností. Stanovte zamýšlené pravidlo seskupování a přiložte jednosměrný příklad, aby navržená implementace omylem nepovažovala orientovaný vztah za neorientované spojení.
Jak mapovat skutečné objekty projektu na vrcholy?
Udržujte výslovné mapování, které příjemce může použít k výkladu výsledků. Prozkoumejte, co se stane při odstranění či změně pořadí objektů, a otestujte, že vrácené skupiny stále odkazují na zamýšlené objekty projektu.
Určuje seskupování závislostí pořadí provádění?
Odpovídá na jinou otázku. Aplikace může potřebovat další logiku pro seřazení skupin či zpracování cyklů. Tento požadavek určete zvlášť a prozkoumejte příslušného příjemce místo předpokladu, že rozdělení do skupin je úplným plánem provádění.
Proč do kontrol zahrnout izolované vrcholy?
Ověřují, že i objekty bez hran dostanou reprezentaci očekávanou aplikací. Kontrolujte výstup pomocné funkce i pohled příjemce, zejména pokud refaktoring vytváří mezistruktury procházením pouze existujících spojení.
ComponentWisp · Aktualizováno 2026-10-25