AND 노드와 OR 노드가있는 유향 그래프를 고려하십시오. AND 노드는 내부의 모서리가 활성화 된 경우에만 활성화됩니다. OR 노드는 적어도 하나의 에지가 활성화되어 있으면 활성화됩니다. 효율적인 알고리즘을 설계하는 방법 모든 노드를 활성화 할 수 있는지 결정하려면? 몇 가지 간단한 알고리즘을 생각해 봤지만 O (n^3) 시간이 걸립니다. 나는 또한 그들에 가장자리가없는 vertex가 초기에 활성화된다고 가정하고있다. 나는 n^3이 효율적인 알고리즘이 될 수 없다고 생각하며, 내가 놓친 몇 가지 방법이 있다고 생각한다. 문제가있는 도메인에 태그를 지정하면 해결책이 될 수 있습니다.AND 노드 및 OR 노드 활성화
답변
그래프를 전처리하여 각 노드의 학위를 계산할 수 있습니다.
학위가 0 인 모든 노드를 스택에 추가하고 각 노드의 활성화 횟수 (처음에는 0)를 포함하는 배열 A를 준비합니다.
그런 다음이 최대 한 번 각 모서리와 각 노드를 방문, 그래서 선형 복잡도를해야합니다
visited = set(stack)
while stack:
node = stack.pop()
for dest in node.neighbours():
A[dest] += 1
if ((Type[dest]==AND and A[dest]==indegree[dest]) or
(Type[dest]==OR and A[dest]>0)):
if node not in visited:
visited.add(node)
stack.append(dest)
다음 의사 코드을 수행하십시오.
프로세스를 완료하면 visited에는 활성화 된 노드 집합이 포함됩니다.
나는 이것이 본질적으로 내 코드와 동일하다고 생각한다. 단지 더 우아한 것이다. –
친절한 단어를 주셔서 감사합니다. 그것은 원근법의 문제라고 생각합니다. –
이미 활성화 된 노드의 집합 A
, 노드의 큐 Q
및 각 노드의 인 에지의 카운터 C
을 유지 관리합니다. - 가장자리에 계산에 의해
시작 :
for each n in nodes {
for each n2 adjacent to n {
C[n2] += 1
}
}
그런 다음 어떤 - 에지와 노드와 Q를 초기화 : 큐가 비워 질 때까지
for each n in nodes {
if C[n] == 0 {
add n to Q
}
}
지금,이 과정을 반복 :
take q from Q
for each n adjacent to q {
if n is in A { continue }
if n is OR {
add n to A
add n to Q
} else { // n must be AND
C[n] -= 1
if C[n] is 0 {
add n to A
add n to Q
}
}
}
[이것은 OR 노드와 AND 노드의 차이점을 처리하는 위상 정렬의 변형입니다.] .
이 프로세스가 종료되면 A
세트에는 활성화 된 모든 노드가 포함됩니다.
런타임은 O (V + E)입니다. 여기서 V는 그래프의 노드 수이고 E는 가장자리 수입니다.
O (n)에서 가능합니다. 가능한 알고리즘이 있습니다.
n
노드
s
노드 N은 수신 수를 카운트
c
배열 활성화되었는지 나타내는
a
어레이 활성화 된 노드들의 합의 총 개수 노드 n의 모서리
들어오는 모서리가없는 경우 노드를 반복하여 전파 함수를 호출합니다. 예 : propagate(i);
.
s == n
의 경우 모든 노드가 활성화되었습니다.propagate
기능
의사 코드 :
function propagate(idx) {
if (a[idx]) // is node activated already
return; // return because node was already propagated
a[idx] = true; // activate
s++; // increase the number of activated nodes
for (var j = 0; j < outEdges[idx].length; j++) { // iterate through the outgoing edges
var idx2 = outEdges[idx][j]; // the node the edge is pointing to
if (isOrNode[idx2]) {
propagate(idx2);
} else { // AND node
c[idx2]++; // increase the count of incoming activated edges
if (inEdges[idx2].length == c[idx2]) // all incoming edges have been activated
propagate(idx2);
}
}
}
- 1. 동작시 노드 기능 활성화
- 2. Fancytree 버튼 클릭시 노드 활성화
- 3. 노드 웹킷에서 터치 이벤트 활성화
- 4. 노드 및 하위 노드 삭제
- 5. HtmlAgilityPack 및 노드 및 하위 노드 선택
- 6. 업로드 및 노드 형식으로 저장 노드 형식
- 7. C# XML 파일로드 및 노드 찾기 노드
- 8. pyparsing에서 노드 및 노드 관계를 어떻게 파싱합니까?
- 9. 차이점 : 단일 노드 및 다중 노드
- 10. 테마 노드 생성 및 노드 편집 템플리트
- 11. 힙 차이 노드 4 및 노드 6
- 12. createElement() 내에 복제 노드 및 노드 삽입
- 13. xml 노드 및 노드 내부의 기타 정보
- 14. 노드/돛에서 세션 재개 활성화 js
- 15. 노드
- 16. 노드
- 17. 노드
- 18. 노드
- 19. 노드
- 20. 노드
- 21. 노드
- 22. 노드 레드 : CSV 노드
- 23. Firebase의 구조 노드 노드
- 24. 노드 -
- 25. TreeView 축소 및 선택된 노드 및 부모 노드 제외
- 26. Kubernetes 노드 간 노드 배포
- 27. 노드
- 28. 노드
- 29. 노드
- 30. 노드
모든 초기에 활성화 들어오는 가장자리 노드와 다음 그래프를 통해 그 내용을 전파하고 모든 노드가 활성화 될 경우 알고 싶어? – maraca
예, 너무 순진하지 않은 알고리즘. – CoderAmateur
이것은 디지털 논리 회로가 아닙니다. 그것은 그래프입니다. 질문이 혼란 스럽다면 유감입니다. 디지털 로직 회로와 관련된 태그는 언급하지 않았습니다. – CoderAmateur