무 방향 그래프의 최단 경로?


19

그래서 나는 (이것은 다소 기본적인) 질문이 여기에 속한다고 생각했습니다.

10x10 패턴으로 배열 된 100 노드 크기의 그래프가 있다고 가정 해보십시오 (체크 보드 생각). 그래프는 방향이 지정되지 않고 가중됩니다. 그래프를 통해 이동하려면 세 개의 공간을 앞으로 이동하고 한 공간을 오른쪽 또는 왼쪽으로 이동합니다 (체스 기사가 보드를 가로 질러 움직이는 방법과 유사).

고정 된 시작 노드가 주어지면 보드의 다른 노드에 대한 최단 경로를 어떻게 찾을 수 있습니까?

나는 움직일 수있는 노드 사이에만 가장자리가있을 것이라고 상상했다. 따라서이 정보가 주어지면 시작 노드에서 끝 노드까지의 최단 경로를 찾고 싶습니다.

저의 초기 생각은 각 모서리에 가중치 1이 가중되었다는 것이 었습니다. 그러나 그래프는 방향이 지정되지 않았기 때문에 Djikstras가 이상적인 것은 아닙니다. 따라서 변경 된 깊이 우선 검색 형식을 사용하여 결정했습니다.

그러나 나는 내 인생에서 검색을 사용하여 최단 경로를 얻는 방법을 시각화 할 수 없었습니다.

내가 시도한 또 다른 것은 시작 노드를 루트로하여 트리 형태로 그래프를 넣은 다음 원하는 끝 노드를 제공하는 가장 얕은 (가장 낮은 행 번호) 결과를 선택하는 것입니다 ...이 효과는 있었지만 엄청나게 비효율적이었습니다. 더 큰 그래프에서는 작동하지 않습니다.

누구든지 이것에 대해 올바른 방향으로 나를 지적 할 수있는 아이디어가 있습니까?

대단히 감사합니다.

(그래프를 시각화하려고했지만 명성이 낮아서 실패했습니다)

답변:


19

그래프의 가장자리가 특정 위치 사이의 유효한 이동 만 나타내는 경우 Dijkstra를 사용하면 정상적으로 작동합니다. 그러나 그래프에 가중치가 부여되지 않으면 과잉 상태입니다. 간단한 너비 우선 검색은 최적의 답변을 제공합니다.


오 man 나는 BFS조차 생각조차하지 않았다! 엄청 고마워!
gfppaste

과잉은 어떻습니까? 구현이 조금 더 어려울 수도 있습니다.

또한 BFS가 더 효율적이라고 덧붙이고 싶습니다. BFS는 O(|E|), Dijkstra는 O(|E| + |V|log(|V|).
Doug Ramsey

@ user742 BFS는 Djikstras보다 빠릅니다. Djikstra는 O(mn)BFS는O(V + E)
CodyBugstein

13

니콜라스는 이미 완벽한 답을 제공했습니다. 그러나 깊이 우선 검색을 사용하려는 원래의 시도를 설명하겠습니다.

첫째, Dijkstra (Nicholas Mancuso가 언급 한 비가 중 노드에서 잘 작동 함) 또는 너비 우선 검색은 기하 급수적 인 메모리 낭비를 초래합니다. 그러나 최적의 솔루션을 찾도록 보장하면서 노드를 다시 확장하지 않는다는 장점이 있습니다. 불행히도 그들의 한계는 매우 중요하며 합리적으로 확장 될 것으로 기 대해서는 안됩니다.

미디엄엑스케이나는미디엄엑스+나는×케이미디엄엑스=케이=1 그러면 솔루션 깊이에서 메모리를 선형으로 사용하면서 최적의 솔루션을 찾을 수 있습니다.

글쎄, 당신은 노드를 다시 확장하는 것이 오히려 나쁜 생각이라고 생각할 수도 있습니다. 전혀! 이것은 전체 실행 시간을 지배하는 반복이 마지막 것이므로 메모리의 선형 소비를 보장하는 것이므로이 알고리즘이 의 오버 헤드에서 발생한다는 것을 입증 할 수 있습니다1

건배,

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.