(자료구조) 복습 #1
트리
트리는 계층적인 자료를 표현하는데 적합한 자료구조
사이클을 가지 않는 연결 그래프
용어들 :
- 노드 : 트리의 구성요소
- 루트 : 부모가 없는 노드
- 서브트리 : 하나의 노드와 그 노드들의 자손들로 이루어진 트리
- 노드의 차수 : 어떤 노드가 기자고 있는 자식 노드의 개수
- 레벨 : 트리의 각층에 번호를 매기는 것
- 높이 : 트리가 가지고 있는 최대 레벨
이진 트리
모든 노드가 2개의 서브 트리를 가지고 있는 트리, 서브 트리 간의 순서가 존재함
n개의 노드를 가진 이진 트리는 정확하게 n-1개의 간선을 가짐.
높이가 h인 이진트리는 최소 h개의 노드를 가지며 최대 2^h - 1의 노드를 가짐
이진트리의 분류 :
- 포화 이진 트리 : 최대의 노드를 가진 이진트리
- 완전 이진 트리 : 노드를 왼쪽부터 채운 이진트리
- 기타 이진 트리
이진트리는 배열 or 포인터로 표현가능
- 배열 표현법 : 기억공간의 낭비가 심해짐
- 노드 i의 부모 노드의 인덱스 = i/2
- 노드 i의 왼쪽 자식 노드 인덱스 = 2i
- 노드 i의 오른 자식 노드 인덱스 = 2i + 1
- 링크 표현법 : 2차원적으로 연결된 구조
typedef struct TreeNode{
int data;
struct TreeNode *left, *right;
}TreeNode;
이진 트리의 순회
V : 방문, L : 왼쪽서브트리, R : 오른쪽 서브트리
- 레벨 순회 : 낮은 레벨부터 차례대로 방문
- 전위 순회 : VLR
- 중위 순회 : LVR
- 후위 순회 : LRV
이진 탐색 트리 (BST)
시간복잡도 O(n)
- 모든 원소의 키는 유일한 키를 가짐
- 왼쪽 서브 트리 키들은 루트 키보다 작다
- 오른쪽 서브 트리의 키들은 루트의 키보다 크다
- 왼쪽과 오른쪽 서브 트리도 이진 탐색 트리이다.
우선순위 큐
데이터들이 우선 순위를 가지고 있는 큐
배열, 연결 리스트, 히프로 구현가능
히프
데이터가 동적일때, 최대값을 많이 찾을 때 사용
완전이진트리이고 key(부모노드) >= key(자식노드)임
삽입, 삭제 시간 복잡도 O(log n), 정렬 시간 복잡도 O(nlog n)
히프의 종류
- 최대 히프 : 부모 노드의 키값이 자식 노드의 키값보다 크거나 같은 완전 이진트리
- 최소 히프 : 부모 노드의 키값이 자식 노드의 키값보다 작거나 같은 완전 이진트리
허프만 코드
글자의 사용빈도에 따라 글자를 압축하는 코드
사용빈도가 높은 글자가 낮은 레벨의 노드에 저장됨
그래프
객체 사이의 연결 관계를 표현할 수 있는 자료구조임
정점과 간선들의 유한 집합
- 정점(vertex), 노드(node) : 여러 가지 특성을 가질 수 있는 객체
- 간선(edge), 링크(link) : 정점들 간의 관계
그래프는 무방향 그래프와 방향 그래프로 구분됨
- 네트워크(가중치 그래프) : 간선에 비용이나 가중치가 할당된 그래프
- 부분 그래프 : 어떤 그래프의 정점의 일부와 간선의 일부로 이루어진 그래프
- 연결 그래프 : 모든 정점쌍에 대하여 항상 경로가 존재하는 그래프
- 완전 그래프 : 모든 정점이 서로 연결되어 있는 그래프
- 정점의 차수(degree) : 그 정점에 인접한 정점의 수
- 단순 경로 : 경로 중에서 반복되는 간선이 없는 경우
- 사이클(cycle) : 단순 경로의 시작 정점과 종료 정점이 동일한 경로
그래프 표현 방법
- 인접 행렬(배열)로 표현
- 인접 리스트(리스트)로 표현
깊이 우선 탐색 (DFS)
시작 정점에서 한 방향으로 계속 가다가 더 이상 갈 수 없게 되면
가장 가까운 갈림길로 돌아와서 다른 방향으로 다시 탐색 진행
depth_first_search(v):
v를 방문되었다고 표시;
for all u <- (v에 인접한 접점) do
if (u가 아직 망문되지 않았으면)
then depth_first_search(u)
순환 호출이나 스택을 사용
너비 우선 탐색(BFS)
시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문
breath_first_search(v):
v를 방문했다고 표시;
큐 Q에 정점 v를 삽입
while(Q가 공백이 아니면) do
Q에서 정점 w를 삭제
for all u <- (w에 인접한 정점) do
if(u가 아직 방문되지 않았으면)
then u를 큐에 삽입;
u를 방문되었다고 표시;
(원형)큐를 사용
최소비용 신장 트리(MST)
- 신장 트리 : 그래프 내 모든 정점을 포함하는 트리
n개의 정점을 정확히 (n-1)개의 간선으로 연결함.
- 최소 비용 신장 트리
신장 트리 중에서 사용된 간선들의 가중치 합이 최소인 신장 트리
- Kruskal의 MST 알고리즘
탐욕적인 방법(greedy method) 사용
간선(v)의 가중치(w)를 오름차순으로 정렬함.
for(i = 0..w의 개수)
if( v(i)를 포함했을 때 사이클이 만들어지지 않으면)
결과 E에 v(i)를 포함한다.
- Prime의 MST 알고리즘
시작 정점에서 출발하여 연결된 간선 중 가장 비용이 적은 간선을 선택
우선순위 큐를 사용함
최단 경로
네트워크에서 정점 i와 정점 j를 연결하는 경로 중에서 간선들의 가중치 합이 최소가 되는 경로를 찾는 문제
- Dijkstar의 최단 경로 알고리즘
네트워크에서 하나의 시작정점으로부터 모든 다른 정점까지의 최단 경로를 찾는 알고리즘
시간 복잡도 : O(n^2)
distance[w] = min(distance[w], distance[u] + weight[u][w])
- Floyd의 최단 경로 알고리즘
그래프에 존재하는 모든 정점 사이의 최단 경로를 한 번에 모두 찾아주는 알고리즘
floyd(G) :
for k <- 0 to n-1
for i<-0 to n-1
for j<- 0 to n-1
A[i][j] = min(A[i][j], A[i][k] + A[k][j])
위상 정렬
방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점을 나열하는 것
topo_sort(G)
for i<- 0 to n-1 do
if(모든 정점이 선행 정점을 가지면)
then 사이클이 존재하고 위상 정렬 불가
선행 정점을 가지지 않는 정점 v 선택;
v 출력;
v와 v에서 나온 모든 간선들을 그래프에서 삭제;
정렬
물건을 크기 순으로 오름차순이나 내림차순으로 나열하는 것
선택정렬 O(n^2)
최솟값 or 최댓값을 찾아서 필요한 위치와 교환함
selection_sort(A,n):
for( i <- 0 to n-2)
least <- 최소값
A[i] <-> least
i++
삽입정렬 O(n^2)
정렬되어 있는 리스트에 새로운 레코드를 적절한 위치에 삽입하는 과정을 반복
insertion_sort(A,n):
for i<- 1 to n-1 do
key <- A[i]
j <- i-1
while j>=0 and A[j] > key do
A[j+1] <- A[j];
j<-j-1;
A[j+1] <- key
버블정렬 O(n^2)
인접한 2개의 레코드를 비교하여 크기가 순서대로 되어 있지 않으면 서로 교환함.
BubbleSort(A, n):
for i <- n-1 to 1 do
for j <- 0 to i-1 do
j와 j+1번째의 요소가 크기순이 아니면 교환
j++;
i--;
합병 정렬 O(nlogn)
분할-> 정복 -> 결합의 단계를 거침
- 분할 (Divid) : 입력 배열을 같은 크기의 2개의 부분 배열로 분할
- 정복(Conquer) : 부분 배열을 정렬, 부분 배열의 크기가 충분히 작지 않으면 순환 호출을 이용하여 다시 분할 정복 기법을 적용
- 결합(Combine) : 정렬된 부분 배열들을 하나의 배열에 통합함.
퀵 정렬 O(nlogn)
- 리스트 안에 있는 한 요소를 피봇(pivot)으로 선택
- 피봇보다 작은 요소를 피봇의 왼쪽으로 이동하고 피봇보다 큰 요소를 피봇의 오른쪽으로 이동
- 피봇을 제외한 왼쪽 리스트와 오른쪽 리스트를 다시 정렬
- 그외 정렬 : 히프 정렬 O(nlogn), 기수정렬 O(dn), 쉘 정렬 O(n^1.5)
가장 빠른 정렬은 합병 정렬과 퀵 정렬
탐색
정렬되지 않은 배열에서의 탐색
- 순차 탐색 O(n)
처음부터 끝까지 하나씩 탐색
정렬된 배열에서의 탐색
- 이진 탐색 O(logn)
배열의 중앙값을 조사하고 찾는 값이 중앙값보다 작으면 왼쪽 크면 오른쪽을 탐색한다
- 색인 순차 탐색
index라 불리는 테이블을 사용하여 효율을 높이는 방법
- 보간탐색
탐색키가 존재할 위치를 예츨하여 탐색하는 방법 ex) 전화번호부, 사전
- 이진탐색 트리
- AVL 트리
각 노드에서 왼쪽 서브 트리의 높이와 오른쪽 서브트리의 높이 차가 1 이하인 이진 탐색 트리
- 2-3 트리
차수가 2 또는 3인 노드를 가지는 트리
이진 탐색 트리의 알고리즘과 비슷함
해싱
키에 산술적인 연산을 적용하여 항목이 저장되어 있는 테이블의 주소를 계산하여 항목에 접근하는 것
빠른 검색을 위한 자료구조
추상 자료형 사전
- 사전 : (키, 값) 쌍의 집합, 맵이나 테이블로 불리기도함
- 키(key) : 사전의 단어처럼 항목과 항목을 구별시켜주는 것
- 값(value) : 단어의 설명에 해당한다.