C 자료구조
-
Graph - Connectedcomponent( 연결 성분 )C 자료구조/Graph 2020. 7. 11. 23:14
내용 앞에서 만든 DFS 내용을 그대로 가지고 와서 만든다. 1. 개념 연결 성분이란 최대로 연결된 부분 그래프를 말한다. 즉, 연결된 부분 그래프들 중에서 크기가 최대인 것을 연결 성분이라고 한다. 아래의 그래프에는 2개의 연결 성분이 있다. 위의 그래프를 연결 성분 함수를 호출하면 연결성분을 표시한 배열Visit는 아래의 그림과 같다. 즉, 정점의 집합 { A, B, C }와 집합 { D, E }가 연결 성분임을 알 수 있다. 연결 성분을 찾기 위해서 깊이 우선 탐색이나 너비 우선 탐색을 이용한다. 먼저, 그래프 상의 임의의 정점을 선택해 깊이 우선 탐색이나 너비 우선 탐색을 시작하면 시작 정점과 연결되어 있는 모든 정점들이 출력된다. 다음에 방문 안된 정점을 선택해서 다시 탐색을 실행하면 그 정점을..
-
Graph BFS with queueC 자료구조/Graph 2020. 7. 8. 19:05
내용 1. 개념 너비 우선 탐색( BFS )은 시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법이다. 너비 우선 탐색을 위해서는 방문한 정점들을 차례로 저장한 후, 꺼낼 수 있는 자료 구조인 큐가 필요하다. 큐는 앞에서 만든 것을 이용할 것이다. 즉, 정점이 방문될 때마다 큐에 방문된 정점을 삽입하고, 더 이상 방문할 인접 정점이 없는 경우에는 큐의 앞에서 정점을 꺼내어 그 정점과 인접한 정점들을 모두 차례대로 방문하게 된다. 초기 상태의 큐에는 시작 정점만이 저장되고, 너비 우선 탐색 과정은 큐가 소진될 때까지 계속한다. 여기에서도 pVisit배열을 쓴다. 너비 우선 탐색을 그림으로 보자. 아래에 임의의 그래프가 주어졌다고 가정하자. [그림 1] 위의..
-
Graph DFS with RecursionC 자료구조/Graph 2020. 7. 8. 00:39
내용 구현은 앞에서 만든 내용을 가지고 오자. 1. 개념 깊이 우선 탐색( DFS )은 미로를 탐색할 때, 한 방향으로 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로 돌아와서 이곳으로부터 다른 방향으로 다시 탐색을 진행하는 방법과 유사하다. 깊이 우선 탐색은 그래프의 시작 정점에서 출발하여 먼저, 시작 정점StartVertex를 방문하고 방문하였다고 표시를 한다. StartVertex에 인접한 정점들 중에서 아직 방문 하지 않은 정점u가 있다면 u를 시작 정점으로 하여 깊이 우선 탐색을 다시 시작한다. 이 탐색이 끝나게 되면, 다시 StartVertex에 인접한 정점들 중에서 아직 방문이 안된 정점을 찾는다. 만약 없으면 종료하고, 있다면 다시 그 정점을 시작 정점..
-
Graph ( 비용 제외 )C 자료구조/Graph 2020. 7. 6. 09:08
인용 1. 개념 그래프는 연결되어 있는 객체 간의 관계를 표현할 수 있는 자료구조이다. 그래프의 대표적인 예시는 지도 이다. 지도에는 여러 개의 도시들이 있고, 도시들은 서로 연결되어 있다. 그래프 구조는 인접 행렬이나, 인접 리스트로 표현하고 처리할 수 있다. 그래프는 정점(Vertex)과 간선(Edge)들의 집합으로 구성된다. 수학적으로는, G = (V,E) 로 표시한다. 그래프의 대표적인 그림은 아래와 같다. 위의 그림은 대표적으로 무방향 그래프이다. 간선의 방향이 없기 때문. 2. 인접 리스트 방식 설명 우리가 만들려고 하는 그래프를 먼저 그려보자. 그리고, 위의 그래프의 모양을 아래와 같이 표현 가능하다. 여기서 그래프를 표현한 방식은 인접 리스트를 이용했다. 즉, 각 각의 정점에 인접한 정점들..
-
Set - 경로 압축C 자료구조/Set 2020. 7. 2. 23:52
인용 앞에서 만든 집합을 그대로 가지고 와서 구현. 1. 개념 경로압축은 FindSet을 행하는 과정에서 경로의 길이를 줄이는 아이디어를 넣은 것. FindSet을 수행하는 과정에서 만나는 모든 노드들이 직접 루트를 가리키도록 포인터를 바꾸어준다. 이렇게 함으로써, 트리의 랭크(높이)를 줄일 가능성이 높다. 아래와 같이 임의의 트리가 있다고 가정해보자. [그림 1] 위의 그림에서 FindSet(G)를 하면 아래와 같은 그림이 나오는 것을 의미한다. [그림 2] 위의 그림과 같이, 노드G에서 루트에 이르는 경로 상에 있는 모든 노드들이 직접 루트 노드를 가리키도록 바뀌었다. 이 알고리즘에서는 함수의 리턴값을 이용하여 포인터를 갱신하고 있다. FindSet(x)를 경로압축한 의사..
-
Set - 집합에 랭크를 추가C 자료구조/Set 2020. 6. 30. 20:01
인용 1. 설명 앞에서 한 기본적인 내용을 기반으로 랭크를 추가할 것. 각 노드는 자신을 루트로 하는 서브트리의 높이를 랭크(Rank)라는 이름으로 저장한다. 단 하나의 노드로 이루어진 트리의 높이는 0이라고 정의한다. 루트 노드의 랭크가 해당 집합의 랭크가 된다. 아래의 [그림 1]은 집합을 나타내는 트리에서 각 노드의 랭크를 사각형 안에 표기한 것이다. 랭크를 이용한 Union에서는 두 집합을 합칠 때, 랭크가 낮은 집합을 랭크가 높은 집합에 붙인다. [그림 1] 아래의 [그림 2]에서 두 집합의 랭크는 각 각 2와 1이다. 랭크가 1인 집합을 랭크가 2인 집합에 붙였고, 두 집합의 랭크는 여전히 2이다. 이런 방식으로 합칠 때, 합집합의 랭크가 커지는 경우는 두 집합의 ..
-
Set - BasicC 자료구조/Set 2020. 6. 29. 19:26
인용 1. 개념 여기서는 각 집합을 하나의 트리로 표현하는 방법을 배울것이다. 흔히 다루는 트리와는 조금 다른 방식의 표현을 쓴다. 트리를 나타낼 때, 보통은 부모 노드가 자식 노드를 가리키도록 하지만 여기서는 자식 노드가 부모 노드를 가리키도록 한다. 아래 [그림 0 ]은 트리를 이용한 집합 표현의 예로, 8개의 원소로 이루어진 집합이 트리로 표현되었다. 임의의 노드에서 부모를 가리키는 포인터를 계속 따라가다 보면 자신이 속한 트리의 루트 노드를 만나게 된다. 이 루트 노드가 집합의 대표 노드이다. 트리를 이용한 처리에서 루트 노드의 부모 노드 포인터는 아래 [그림 0 ]과 같이 자신을 가리킨다. [ 그림 0 ] 트리를 이용한 표현에는 두 집합을 합하는 작업은 연결 리스..