가장 효율적인 알고리즘을 지정하십시오. 감지하는 내의 모든 주기를 유향 그래프?
I have a 유향 그래프 사이트용 예약을 하는 작업을 실행할 수 있으며, 현재 작업 중인 노드입니다 종속성을 모서리입니다. 이 경우 순환 그래프 등 내에서 오류를 감지할 수 데릭쉐퍼드와 사이클입니다 종속도.
# 39 의 구성 요소를 강하게 접속됨 Tarjan& 알고리즘입니다 은 'O' 시간 복잡도 (E + v).
강하게 접속됨 구성 요소 의 다른 알고리즘, 지켜보리니 위키백과.
이는 일정 등을 감안할 때, 일부 지점에서 작업을 하는 의심이 것인지 그 실행 주문하십시오 붙여넣습니다 sort 제안했다.
따라서 중요한 것이 아니라, 내가 가장 효율적으로 tsort" " 어떻게 될 수도 있다,, 가장 효율적으로 loops" 탐지합니다 " 어떻게 합니까. 하지만, 아마도 " library" 사용할 수 있는 대답은 하지 않을 경우, 그 다음 위키백과 문서:
>. http://en.wikipedia.org/wiki/Topological_sorting
에 대한 간략한 설명, 그리고 다른 한 알고리즘입니다 의사코드의 충스러웠으니 트라야누스. 둘 다 'O' 시간 복잡도 (V + e).
이 회사는 이를 위해 가장 간단한 방법으로 깊이 우선 탐색 (DFT) 의 do graph.
이 경우, 'n' 은 'O (n)' 가 정점을 그래프화합니다 시간 복잡도 알고리즘입니다. 해야 할 수 있는 것이므로, 각 교점까지의 DFT 시작으로 총 O (n ^ 2) 가 '복잡한'.
현재 깊이까지의 stack 유지할 수 있습니다, 첫 번째 요소를 포함하는 모든 교점이 첫 traversal 색상에는 기술입니까 루트 노드입니다. 즉, 이미 발견한 경우 그런 요소를 가지고 있는 동안 스택할 DFT 사이클입니다.
제 생각에는, 가장 잘 이해할 수 있는 유향 그래프 () 은 사이클입니다 감지하는 알고리즘입니다 그래프 색칠 알고리즘입니다.
이는 그래프의 그래프 색칠 알고리즘입니다 볼넷 한 DFS 분할합니다 (깊이까지의 즉, 첫 번째 검색 경로를 탐험한다 탐험이요 전에 완전히 다른 경로). 이 같은 루프지 포함하는 뒤로를 찾으면 모서리까지 자국이야 그래프
에 대해 심도 있는 그래프 색칠 알고리즘입니다 이 기사를 읽어 보십시오. http://www.geeksforgeeks.org/detect-cycle-direct-graph-using-colors/
그리고, 내가 구현을 제공한다 그래프 색칠 JavaScript 로 https://github.com/dexcodeinc/graph_algorithm.js/blob/master/graph_algorithm.js
또한, root" " 대한 정보를 얻을 수 있습니다. 이 때 도움이 되는 노드입니다 순환 상관 따라오렴 사용자가 이 문제를 해결하십시오.
또 다른 방법은 시도하시겠습니까 다음 상관 찾기 위해 노력하고 있습니다. 이를 위해 가격목록이 스택할 where you are what you need to 기억할 수 있는 일부, 지금 모르겠습니다. 이미 그 전에 여기있을 스택할 실행하십시오 종속성 확인합니다. 이 경우, ve com/downloads/global/corporate/iar/esg_prosupport. you& # 39 는 사이클입니다.
이렇게 복잡한 O ( ) 를 잊지 말아야 할 수 있을 것 같아 스택이 변경되었는지 깊이 있는 매우 제한된 (따라서 N 은 소형), 그리고 그 때마다 M 로 축소, executed" " 않는 종속성을 끄기도구 확인할 수 있습니다. 또한 검색 com/downloads/global/corporate/iar/esg_prosupport. 막을 수 있을 때 리프 (, * 확인할 수 있도록 모든 노드에 > 적이 있다. M 적립율은 작은, 고쳐주렴).
내가 만든 후, 그래프 메타마크 에 목록으로 삭제한 열거합니다 자연스럽게 줄일 수 있는 모든 노드에 as I 처형되었다 검색 볼륨입니다. 실제로, 이 모든 독립 확인란 나는치료가그렇게 들어온넘 정상 실행 자동으로 실행할 수 있었다.
필요할 경우, 테스트 " only". 모드 a " 추가하기만 dry-run"; 실제 작업을 실행할 수 있는 플래깅 비활성화합니다.
표제어 [카르멘 et al., Introduction 를 Algorithms] 의 따르면 22.11 (https://books.google.com/books? id = i-bUBQAAQBAJ&, 액화석유가스 (lpg) = PP1&, dq = cormen% 20introduction% 20to% 20algorithms&, pg = pp1 # onepage&, v = q = cormen% 20introduction% 20to% 20algorithms&, f = false) (clr):
깊이 우선 탐색 비순환 유향 그래프 G 는 > 매핑되며, G 는 없는 경우에만 익올때 뒤로를 모서리입니다.
지금까지 언급한 여러 대답. # 39, 또한 여기에서 ll I& 기준으로 총 22 개 장 clr 코드 예제. 예를 들면 그래프 아래에 나와 있습니다.
예에서 clr 는 그림 22.4 그래프에서 두 DFS 진단트리: 1 개의 노드로 구성된 u,, 또 다른 w y v x 및 노드의 및 z. 각 진단트리는 뒤로를 모서리까지 하나씩 들어 있습니다. 할 수 있고, 다른 한 x v 충스러웠으니 z z (a 자기 루프).
한 때 발생하는 데 있어서 가장 중요한 것은 '가 있는 동안 dfs dell. 뒤로를 면쪽' 기능을 통해 'v' 의 반복, 노드입니다 발견될 수 있는 '이웃' u '회색' 컬러.
<! - 언어: 파이썬 - >.
import collections
class Graph(object):
def __init__(self, edges):
self.edges = edges
self.adj = Graph._build_adjacency_list(edges)
@staticmethod
def _build_adjacency_list(edges):
adj = collections.defaultdict(list)
for edge in edges:
adj[edge[0]].append(edge[1])
return adj
def dfs(G):
discovered = set()
finished = set()
for u in G.adj:
if u not in discovered and u not in finished:
discovered, finished = dfs_visit(G, u, discovered, finished)
def dfs_visit(G, u, discovered, finished):
discovered.add(u)
for v in G.adj[u]:
# Detect cycles
if v in discovered:
print(f"Cycle detected: found a back edge from {u} to {v}.")
# Recurse into DFS tree
if v not in discovered and v not in finished:
dfs_visit(G, v, discovered, finished)
discovered.remove(u)
finished.add(u)
return discovered, finished
if __name__ == "__main__":
G = Graph([
('u', 'v'),
('u', 'x'),
('v', 'y'),
('w', 'y'),
('w', 'z'),
('x', 'v'),
('y', 'x'),
('z', 'z')])
dfs(G)
참고로 '시간' 이 들어 있는 CLRS& # 39. # 39 를 주기 때문에, re we& 의사코드 캡처됩니다 관심을 가질 뿐 아니다. 또한 일부 상용구 코드 구축하기 위한 인접 리스트 목록에서 표현된 그래프란다 모서리입니다.
이 경우, 정보기술 (it) 는 다음과 같은 출력물을 스크립트입니다 csetup 인쇄합니다.
Cycle detected: found a back edge from x to v.
Cycle detected: found a back edge from z to z.
이 예에서 가장자리들을 그것은꿈의 정확히요 뒤로를 clr 그림 22.4.
찾을 수 있는 모든 견딜 수 없는 알고리즘입니다 다항 시간 안에 있는 유향 그래프. 예를 들어, 노드 n 개의 노드를 갖고 있는 유향 그래프 () 는 즉, 모든 페어당 서로 연결되어 있는 경우 완전 그래프. 그래서 이 모든 것을 사이클입니다 많고 2 ^ n 개의 노드를 비어 있지 않은 서브셋에 n-1 개의 등 서브세트를. 아무도 다항 시간 알고리즘이 존재합니다. 그렇게 말할 수 있는 효율적인 (비 바보) 알고리즘입니다 수가 있다고 가정해 봅시다 전달됩니까 사이클에서 그래프란다, 먼저 이 적용 후 강한 접속됨 컴포넌트와의 너회의 알고리즘입니다 찾습니다찾기 접속됨 구성 요소. 미디어만을 주기 때문에 그들 사이에 존재하는 구성 요소 및 없습니다.
이 문제는 내가 가진 구현됩니까 sml (명령형 프로그래밍). 다음은 아웃라인에. 모두 찾을 수 있는 인컨텍스트 노드입니다 이네그리 또는 루트디그리 0 입니다. 노드입니다 사이클 (제거하기 때문에) 등 일부가 될 수 없습니다. 다음 제거 또는 보내는 등 모든 규칙수신되는 에서 가장자리들을 노드입니다. 이 과정을 재귀적으로 적용하십시오 결과 그래프. You are not 왼쪽 끝 부분에 있는 경우 또는 모서리까지 그래프에서 노드를 없는 다른 주기를 가지고 있다.
https://mathoverflow.net/questions/16393/finding-a-cycle-of-fixed-length 가장 맘에 드는 솔루션이므로 위해 특별히 4 길이)
또한 실제 마법사에서는 (i/o V ^ 2) u 해야 할 것이라고 말했습니다. O (V) / O (V+E) 만 필요하다고 생각합니다. 그런 경우 DFS 방문해 그래프화합니다 연결했는지 모든 노드입니다. 그래프 (graph) 가 있는 경우 그 때마다 우리는 이 dfs 실행하십시오 접속됨 서브노드 교점까지의 서브노드 대화할거에요 그래프화합니다 접속됨 찾을 수 있는 이 dfs 향후 실행하십시오 고려해보십시오 정점과 못함. 따라서 각 실행 가능성에 대한 교점까지의 잘못되었습니다.
이 경우 그래프란다 충족합니다 속성
|e| > |v| - 1
그런 다음 그래프화합니다 주소들이 적어도 켜짐이 사이클입니다.