[Algorithm] Prim's Algorithm의 시간 복잡도에 관한 질문
프림 알고리즘을 공부하고 있습니다.
문제는 시간 복잡도가 O(n^2)이 나오는 것이 이해가 안 된다는 것입니다.
Fundamentals Of Data Structures In C++ 2nd [Horowitz 外2]를 읽고 있습니다.
페이지 사진도 첨부했어요.
TV는 Tree에 포함된 Vertex의 집합이며, TV에 포함되는 정점은 다시 목적지로 포함되면 안 됩니다.
near(v)는 TV에 속하고, v는 새로운 목적지이며, cost(near(v), v)가 최소라는 조건을 만족하는 near(v)가 있다고 합시다. TV에 속하지 않은 정점 v, 즉 프림 알고리즘의 새로운 목적지가 될 각각의 v에 대해 near(v)가 TV에 속하고 cost(near(v), v)가 최소라면 시간 복잡도는 O(n^2)가 되도록 구현할 수 있다는 것입니다.
(써놓고 보니 전달이 잘 될 지 모르겠습니다..)
이것은 제가 구현한 Prim 알고리즘의 code입니다.
주석이 없는 점은 죄송하게 생각합니다.
프로젝트 파일을 첨부하였으니, 실행해보고 싶으시면 다운로드하시면 됩니다.
void Graph::prim() const { // assume that G has at least one vertex. const int n = _vertices.count(); Graph tree(n); Array<bool> visited(n); for (int i = 0; i < n; ++i) { visited[i] = false; } visited[0] = true; int edge_count = 0; for (int i = 0; edge_count < n - 1; ++i) { int min_cost = INT_MAX; int src = -1, dst = -1; for (int j = 0; j < n; ++j) { if (visited[j] == false) continue; const Vertex &vertex = _vertices[j]; const std::vector<Edge> &adjList = vertex.adjacencyList(); for (int k = 0, adjCount = adjList.size(); k < adjCount; ++k) { const Edge &edge = adjList[k]; // check src/dst included if (visited[edge.destination()]) continue; // check cost is minimum else if (min_cost > edge.cost()) { src = edge.source(); dst = edge.destination(); min_cost = edge.cost(); } } } if (src < 0) break; // there's no such edge tree.link(src, dst, min_cost); visited[dst] = true; ++edge_count; } if (edge_count != n - 1) { std::cout << "no spanning tree" << std::endl; return; } tree.setAction(show_visited_vertex); tree.dfs(0); tree.setAction(nullptr); }
여기서는 edge_count가 늘어나는 반복문이 n-1회 수행되고,
탐색된 신장 트리에 넣을 새로운 edge의 목적지를 찾는데 n회,
목적지가 발견되면 인접 리스트에서 edge를 찾는 데 n회를 사용하고 있습니다.
결국 제 알고리즘은 O(n^3)으로, O(n^2)보다 못한 성능을 내고 있습니다.
이 코드에서 어떤 부분을 바꾸어야 O(n^2)를 기대할 수 있을지가 궁금합니다.
컴파일 가능한 코드를 원하는 게 아닙니다!! 그냥 의사코드처럼 논리가 보고 싶어요.
긴 글 읽어주셔서 감사합니다.
첨부 | 파일 크기 |
---|---|
L9_Graphs_cont.zip | 3.41 MB |
12369202_1101149396592132_601970488753406536_n.jpg | 102.26 KB |
12376610_1101149399925465_9147979443118915602_n.jpg | 103.96 KB |
이것도 참고해보세요.
다익스트라 알고리즘 [Dijkstra’s algorithm] - 최단경로. 최단거리 계산. 탐색
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사합니다.
그런데 올려주신 자료는 Dijkstra 알고리즘에 관한 것이고,
제가 원하는 것은 Minimum Spanning Tree를 구성하기 위한 Prim's Algorithm이라
질문과 살짝 거리가 있어보입니다.
아무튼 답변은 감사드려요.
저는 이렇게 생각했습니다.
여기 있네요.
MinimumSpanningTree - 예제소스
http://reference.wolfram.com/language/Combinatorica/ref/MinimumSpanningTree.html
http://www.codeproject.com/search.aspx?q=Minimum+Spanning+Tree&x=9&y=1&sbo=kw
Prim's Algorithm - 예제소스
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=Prim%27s+Algorithm
http://www.codeproject.com/search.aspx?q=Prim%27s+Algorithm&doctypeid=1%3b2%3b3%3b13%3b14
MinimumSpanningTree - 네이버 검색
http://search.naver.com/search.naver?sm=stb_hty&where=se&ie=utf8&query=Minimum+Spanning+Tree
MinimumSpanningTree - 구글 검색
http://www.google.co.kr/search?hl=ko&source=hp&biw=&bih=&q=MinimumSpanningTree&gbv=2&oq=MinimumSpanningTree&gs_l=heirloom-hp.3..0i13l10.21886.21886.0.23088.1.1.0.0.0.0.358.358.3-1.1.0....0...1ac.1.34.heirloom-hp..0.1.357._sg_C-82lsE
Prim's Algorithm - 네이버 검색
http://search.naver.com/search.naver?sm=stb_hty&where=se&ie=utf8&query=Prim%27s+Algorithm
Prim's Algorithm - 구글 검색
http://www.google.co.kr/search?q=Prim%27s+Algorithm&hl=ko&biw=&bih=&gbv=2&oq=Prim%27s+Algorithm&gs_l=heirloom-serp.12..0l10.42180.42180.0.43327.1.1.0.0.0.0.139.139.0j1.1.0....0...1ac.1.34.heirloom-serp..0.1.138.pIlwG08wUTw
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사합니다.
답변 감사합니다.
저는 이렇게 생각했습니다.
for문 하나를 줄이셔야 겠네요...
그래야 O(n^2)가 되지 않나...
http://stackoverflow.com/questions/13132548/time-complexity-of-prims-mst-algorithm
에선...
This way, we only ever check distance to find the next target, and since we do this V times and there are V members of distance, our complexity is O(V^2).
각 거리를 체크하는데 V갯수만큼 걸리고, V갯수만큼의 거리들 갯수가 있기때문에 O(V^2)라고 하네요..
잘못 해석했나?...
답변 감사합니다.
distance라는 배열이 있다면 O(V^2)이고, distance라는 배열이 없다면 O(V^3)까지 간다고 써있네요.
소중한 링크 감사합니다. 잘 읽어볼게요!
저는 이렇게 생각했습니다.
댓글 달기