[Algorithm] Prim's Algorithm의 시간 복잡도에 관한 질문

HDNua의 이미지

프림 알고리즘을 공부하고 있습니다.
문제는 시간 복잡도가 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)를 기대할 수 있을지가 궁금합니다.
컴파일 가능한 코드를 원하는 게 아닙니다!! 그냥 의사코드처럼 논리가 보고 싶어요.

긴 글 읽어주셔서 감사합니다.

shint의 이미지

다익스트라 알고리즘 [Dijkstra’s algorithm] - 최단경로. 최단거리 계산. 탐색

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

HDNua의 이미지

그런데 올려주신 자료는 Dijkstra 알고리즘에 관한 것이고,
제가 원하는 것은 Minimum Spanning Tree를 구성하기 위한 Prim's Algorithm이라
질문과 살짝 거리가 있어보입니다.

아무튼 답변은 감사드려요.

저는 이렇게 생각했습니다.

shint의 이미지

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

HDNua의 이미지

답변 감사합니다.

저는 이렇게 생각했습니다.

babbab의 이미지

그래야 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)라고 하네요..

잘못 해석했나?...

HDNua의 이미지

distance라는 배열이 있다면 O(V^2)이고, distance라는 배열이 없다면 O(V^3)까지 간다고 써있네요.
소중한 링크 감사합니다. 잘 읽어볼게요!

저는 이렇게 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.