기본 콘텐츠로 건너뛰기

개발 공부 - [그래프 알고리즘] 순회 - 최소비용신장트리(minimum spanning tree) - 4

 prim의 알고리즘


임의의 노드를 출발노드로 선택

출발 노드를 포함하는 트리를 점점 키워 감

매 단계에서 이미 트리에 포함된 노드와 포함되지 않은 노드를 연결하는 에지들 중 가장 가중치가 작은 에지를 선택


Prim 알고리즘의 동작

시작 단계에서는 시작 정점만이 MST(최소 비용 신장 트리) 집합에 포함된다.

앞 단계에서 만들어진 MST 집합에 인접한 정점들 중에서 최소 간선으로 연결된 정점을 선택하여 트리를 확장한다.

즉, 가장 낮은 가중치를 먼저 선택한다.

위의 과정을 트리가 (N-1)개의 간선을 가질 때까지 반복한다.

Prim 알고리즘의 구체적인 동작 과정

Prim 알고리즘을 이용하여 MST(최소 비용 신장 트리)를 만드는 과정


정점 선택을 기반 으로 하는 알고리즘

이전 단계에서 만들어진 신장 트리를 확장하는 방법






출처 : https://gmlwjd9405.github.io/2018/08/30/algorithm-prim-mst.html



왜 MST가 찾아지는가?

Prim의 알고리즘의 임의의 한 단계를 생각해 보면,

A를 현재까지 알고리즘이 선택한 에지의 집합이라고 하고, A를 포함하는 MST가 존재한다고 가정하자.


출발 노드에 이미 연결된 노드와 그렇지 않은 노드를 연결하는 에지들 중 lightest edge 를 찾을 수 있다.


가중치가 최소인 에지 찾기

V(A) : 이미 트리에 포함된 노드들
V(A) 에 아직 속하지 않은 각 노드 v에 대해서 다음과 같은 값을 유지

key(v) : 이미 V(A) 에 속한 노드와 자신을 연결하는 에지들 중 가중치가 최소인 에지 (u, v)의 가중치
ㅠ(v) : 그 에지 (u, v)의 끝점 u

가중치가 최소인 에지를 찾는 대신 key값이 최소인 노드를 찾는다.

* ㅠ[f]는 파이오브 에프 라고 읽는 것이군...

key 값이 최소인 노드 f를 찾고, 에지 (f, ㅠ(f))를 선택한다.

노드 d, g, e의 key 값과 ㅠ값을 갱신한다.


MST-PRIM(G, w, r)
    for each u <= V do
        key[u] <- zero
        ㅠ[u] <- NIL
    end.
    V(A) <- {r}
    key[r] <- 0
    while |V(A)| < n do // while문은 n-1번 반복
        find u <=/ V(A) with the minimum key value; // 최소값 찾기 O(n)
        V(A) <- V(A) U {u}
        for each V <=/ V(A) adjacent to u do
            if key[v] > w(u, v) then
                key[v] <- w(u, v)
                ㅠ[v] <- u
            end.
        end.
    end.
  • 시간복잡도 O(n^2)

참조: https://mj-seok.com/algorithm/algo-prim/

key 값이 최소인 원소를 찾기

  • 최소 우선순위 큐를 사용
    • V - V(A)에 속한 노드들을 저장
    • Extract-Min : key값이 최소인
MST-PRIM(G, w, r)
    for each u <= V[G]
        do key[u] <- Infinity
            ㅠ[u] <- NIL
    key[r] <- 0
    Q <- V[G]
    while Q =/ zero
        do u <- EXTRACT-MIN(Q)
            for each v <= Adj[u]
                do if v <= Q and w(u, v) < key[v]
                    then ㅠ[v] <- u
                        key[v] <- w(u, v)
                        // 우선순위큐에서 key값 decrease: O(logn)

Prim의 알고리즘 : 시간복잡도

  • 이진 힙(binary heap)을 사용하여 우선순위 큐를 구현한 경우
  • while loop:
    • n번의 Extract-Min 연산 : O(nlogn)
    • m번의 Decrease-Key 연산 : O(mlogn)
  • 따라서 시간복잡도 : O(nlogn + mlogn) = O(mlogn)
  • 우선순위 큐를 사용하지 않고 단순하게 구현할 경우 : O(n^2)
  • Fibonacci 힙을 사용하여 O(m + nlogn)에 구현가능[Fredman-Tarjan 1984]

참조: https://mj-seok.com/algorithm/algo-prim/



어떤게 좋다고 말할수는 없는데 최악/최선의 경우를 설명해 주시는 것

-.-)... 허...허프만 부터는 제정신을 잡고 열심히 하겄읍니다...

O(n^2) 보다 저 피보나치 힙 사용해서 구현하는 편이 낫다고 하심...

댓글

이 블로그의 인기 게시물

Ebook - 전자책 drm 상관 없이 pdf로 만들기

yes24와 교보문고에서 ebook을 구매 해야 했는데 너무 불편하고, 필기가 매우 화날 정도로 안 좋아서 원시적으로 사용하기로 했다. 1. 목적 : ebook에서 필기 및 사용이 불편하여 pdf로 변환  2. 용도 : 개인 사용 목적이며 화질이 다소 저하되어도 필기만 용이하면 상관 없음 3. 방법 1) 휴대폰 및 카메라로 동영상을 촬영했다. DRM 때문에 프로그램으로는 촬영이 안 되는 것을 확인했다. 2) 마우스 클릭 해주는 매크로를 사용했다. (1) key_macro.exe > https://blog.daum.net/pg365/250 듀얼 모니터에서 위치 이탈 현상이 있긴 해도 괜찮았다. (2) AutoClick.exe > http://bestsoftwarecenter.blogspot.com/2011/02/autoclick-22.html 이 걸로 잘 사용했다. 3초마다 한 번 클릭하도록 사용했다. 3) 동영상을 이미지로 변경해주는 프로그램을 사용했다. Free Video to JPG Converter > https://free-video-to-jpg-converter.kr.uptodown.com/windows 일 하면서 듀얼 모니터에 켜 놨는데 속도가 괜찮았다. * Every frame 으로 사용해야 한다. 4) 중복 사진 제거해주는 프로그램을 사용했다. VlsiPics  > http://www.visipics.info/index.php?title=Main_Page 생각보다 느리니 퇴근시에 걸어놓고 가면 된다. 한번 play가 끝나면 Auto-select 하고 Delete 하면 된다. 5) 이미지를 일괄 Crop 작업 해주는 프로그램을 사용했다. JPEGCrops > https://jpegcrops.softonic.kr/ * https://joker1209.tistory.com/11 도 참고했다. View -> Large 로 크게 본 뒤, Edit -> Syncronize Crops 로 일괄 동일하게 적용하는 방식을 사

개발 공부 - json JSONObject 사용 시 백슬래시(\), 원화 표시(\) 제거 및 치환

import org.json.simple.JSONObject; String dataString = new String(authData.toJSONString()); dataString = dataString.replaceAll("\\\\", ""); String 으로 안 바뀌는 가 싶어서 String 으로 변환 해 주고 작업 하였다. 사실 toJSONString 해도 정상 동작 해야 하는데 이유를 잘 모르겠음. 그리고 나서 다시 이클립스 구동 하니 toString 도 먹은 걸로 봐서 이상하다고 생각! String dataString = authData.toString(); dataString = dataString.replaceAll("\\\\", ""); 어쨌든 백 슬래시 제거를 해줘야 하는데 \\ 도 아니고 \\\\를 해야 변환이 가능했다는 결말이었습니다. 참고 : https://stackoverflow.com/questions/15450519/why-does-string-replace-not-work/15450539 test =test.replace("KP", "");  replace 후에 담아 주지 않으면 적용이 안 됩니다!

개발 공부 - OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다.

여러 가지 요인이 있지만 PC 이름 변경시 OracleXETNSListener 서비스 시작이 불가능합니다. 고치는 법은 C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN 와 같은 설치 경로에서 listener.ora와 tnsnames.ora 의 pc명을 바꾼 PC명으로 바꿔주면 됩니다. 그래도 안 된다면 cmd 창에서 services.msc 를 입력 후 OracleXETNSListener 서비스를 시작 시키면 됩니다. 오류명: OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다. 일부 서비스는 다른 서비스 또는 프로그램에서 사용되지 않으면 자동으로 중지됩니다. 참고한 사이트들 1. http://blog.naver.com/visioner7/120165951652 2. http://database.sarang.net/?inc=read&aid=6819&criteria=oracle&subcrit=&id=&limit=20&keyword=ora-12560&page=5 이런 걸 보면 오라클은 앙칼진 시골 아가씨야