본문 바로가기
728x90

알고리즘42

최단경로 - 3 Floyd-warshall 알고리즘 : all to all - 가중치 방향 그래프 G=(V,E), V={1,2,...,n} - 모든 노드 쌍들간의 최단경로의 길이를 구함 - d^k[i,j] : 중간에 노드집합 {1,2,...,k}에 속한 노드들만 거쳐서 노드 i에서 j까지 가는 최단경로의 길이 i와 j가 바로 연결 첫 번째 : 연결 두 번째 : 연결 x n개의 노드가 있으므로 i에서 j로 갈 때 n개의 노드를 거쳐서 감 k를 거치지 않고 간다면 d^k-1[i,j] k를 거쳐서 간다면 d^k-1[i,k] + d^k-1[k,i] 따라서 위의 두 값 중 최솟값을 고르면 된다. 수도코드 - 1 수도코드 - 2 경로 찾기 - 파이 이차원 배열을 만들어준다 - k를 거쳐서 가게 된다면 파이 배열에 k를 넣어준다 경.. 2021. 3. 30.
최단경로 - 2 bellman-ford 알고리즘 예시 - bellman-ford 알고리즘은 시간복잡도 측면에서 효율적이지 않음 => o(nm) - 알고리즘을 한번 실행할 때마다 오른쪽 부분에서는 불필요한 계산이 계속 일어남 - v이전에 노드들을 다 갱신한 후 v의 오른쪽 부분을 갱신하면 불필요한 계산을 줄일 수 있음 => Dijkstra 알고리즘 Dijkstra 알고리즘 - distance가 제일 적은 노드를 기준으로 그 노드와 연결된 노드의 distance를 구한다. - 처음 distance가 0인 노드를 시작한다. - distance가 0 인부분은 다신 안봐도 되므로 오른쪽 부분에서만 가장 작은 distance를 찾는다 - distance가 5인 노드가 제일 작으므로 이 노드를 기준으로 연결된 노드들의 distanc.. 2021. 3. 30.
최단경로 - 1 최단경로 - 가중치 (방향) 그래프 G=(V,E), 즉 모든 에지에 가중치가 있음 - 경로 p=(v0,v1,....vk)의 길이는 경로상의 모든 에지의 가중치의 합 - 노드 u에서 v까지의 최단경로의 길이를 ∂(u,v)라고 표시하자 ==> 최단경로를 공부하는 목적 최단경로문제의 유형 - single-source : 하나의 출발 노드 s로부터 다른 모든 노드까지의 최단 경로를 찾아라. 예 : Dijkstra의 알고리즘 - single-destination : 모든 노드로부터 하나의 목적지 노드까지의 최단 경로를 찾아라. single-source 문제와 동일 - single-pair : one-to-one 주어진 하나의 출발 노드 s로 부터 하나의 목적지 노드 t까지의 최단 경로를 찾아라 최악의 경우 시간복.. 2021. 3. 29.
최소비용신장트리 - 4 prim의 알고리즘 -임의의 노드를 출발노드로 선택 - 출발 노드를 포함하는 트리를 점점 키워 감 - 매 단계에서 이미 트리에 포함된 노드와 포함되지 않은 노드를 연결하는 에지들 중 가장 가중치가 작은 에지를 선택 MST가 되는 이유 - S 와 V-S에서 cross를하면서 가장 가벼운 노드를 고르는 것이므로 MST가 될수 있다. 가중치가 최소인 에지 찾기 - Va : 이미 트리에 포함된 노드들 - Va에 아직 속하지 않은 각 노드 v에 대해서 다음과 같은 값을 유지 key(v) : 이미 Va에 속한 노드와 자신을 연결하는 에지들 중 가중치가 최소인 에지 (u,v)의 가중치 ∏(v) : 그 에지 (u,v)의 끝점 u - 노드들 중에서 key값이 최소인 값을 찾으면 된다. - 다음 노드를 찾는데 걸리는 시간.. 2021. 3. 24.
최소비용신장트리 - 3 원소들의 집합을 표현하는 방법 - 각 집합을 하나의 트리로 표현 * 누가 누구의 자식이고 부모인지는 상관없음 * 각 노드들은 자식노드가 아닌 부모노드의 정보를 갖는다 위의 트리를 배열로 표현할 수 있음 - 각 원소의 부모노드가 무엇인지를 넣는다. find-set(v) 시간복잡도 : 트리의 높이 , 최악의 경우 o(n) union(u,v) - 한 트리의 루트를 다른 트리의 루트의 자식 노드로 만든다. weight union - 두 집합을 union할 때 작은 트리의 루트를 큰 트리의 루트의 자식으로 만듬(여기서 크기는 노드의 개수) - 각 트리의 크기를 카운트하고 있어야 한다. - 위에서 노드를 찾을 때 트리의 높이에 영향을 받는다 했으므로 트리의 높이가 작을수록 좋음 - 큰 트리안에 작은 트리가 들어가면.. 2021. 3. 24.
최소비용신장트리 -2 kruskal 알고리즘 - 에지들을 가중치의 오름차순으로 정렬한다 - 에지들을 그 순서대로 하나씩 선택해간다. 단, 이미 선택된 에지들과 사이클을 형성하면 선택하지 않는다 - n-1개의 에지가 선택되면 종료한다. - 가중치가 작은 순서대로 연결하면서 순환이 되면 연결하지 않는다. 순환여부 확인 - 초기 상태 : 선택된 에지 없음 - 각각의 연결요소를 하나의 집합으로 표현 {a}, {b}, {c}, {d}, {e}, {f}, {g}, {h}, {i} -> {a}, {b}, {c}, {d}, {e}, {f}, {g, h}, {i} -> {a}, {b}, {c, i}, {d}, {e}, {f}, {g, h} -> {a}, {b}, {c, i}, {d}, {e}, {f, g, h} -> {a, b}, {c, i.. 2021. 3. 24.
728x90