Upload
naver-d2
View
23
Download
4
Embed Size (px)
Citation preview
1
2
Tree
“트리는 계층적 관계(Hierarchical
Relationship)를 표현하는 자료구조이다.”
3
Terminology
-노드 Node: A unit if tree which consists of data field and link fields
-노드의 차수 :Degree of a node, number of children of a node
-루트 노드: root node 트리 구조에서 최상위에 존재하는 노드
-단말 노드: terminal node 아래로 또 다른 노드가 연결되어 있지 않은 노드
-내부 노드: internal node 단말 노드를 제외한 모든 노드
4
5
Height and Depth
height depth
6
Binary Tree
• Any tree can be converted into a binary tree structurally
• Features
• Empty tree allowed
• Children order is sensitive
• Whether it is left child or right child
• Max number of node at level (i)
• 2 ( i >= 1)
• Max number of nodes in a tree of height h
• 2 -1 (h >= 0) full binary tree
i-1
h+1
7
Full Binary Tree
Except leaf nodes, the degree of other nodes is two
• A full binary tree of height h has 2 -1 nodes
• Full binary trees satisfy the following
• n0 = n2 + 1
• n0 : # of leaf nodes
• n2 : # of nodes of degree 2
• ex) 4 = 3 + 1
h+1
8
Complete Binary Tree
• Nodes exist sequentially in left-right,
and root-leaf without any missing node in the middle
• FBT => CBT, CBT ≠> FBT
• Height (CBT) = O(log2 n)
9
struct node {int data;struct node* left;struct node* right;
};
/* Helper function that allocates a new node with thegiven data and NULL left and right pointers. */
struct node* newNode(int data) {struct node* node = (struct node*)
malloc(sizeof(struct node));node->data = data;node->left = NULL;node->right = NULL;
return(node);}
10
Search a key in BST* RECURSIVE I
tree_ptr rBST(tree_ptr root, int key) {
if(!root) return NULL;if(key == root->data) return root;if(key < root->data)
return rBST(root->left_child, key);
return rBST(root->right_child, key);}
11
Search a key in BST* ITERATIVE I
tree_ptr iBST(tree_ptr tree, int key) {
while(tree) {if(key == tree->data) return tree;if(key < tree->data)
tree = tree->left_child;else
return tree = tree->right_child;}return NULL;
}
12
Linked list
연결 리스트, 링크드 리스트(linked list)는
각 노드가 데이터와 포인터를 가지고
한 줄로 연결되어 있는 방식으로 데이터를 저장하는
자료 구조이다.
13
배열과 연결리스트의 차이점
배열의 특성은 메모리공간에서 연속이라는 점이다.
그래서 빠른 속도가 보장되지만, 메모리가 연속이어야 하기 때문에삽입과 삭제가 번거롭다.
하지만 연결리스트는 메모리상에 연속이지 않아도 된다.
왜냐하면 다음 데이터에 대한 링크 정보를 지니고 있기 때문이다.
14
연결 리스트에 사용할 구조체 선언
typedef struct list_node {
int data; // 노드에 저장될 데이터
list_pointer link; // 다음 순서의 노드를 가리킴
}
15
Singly linked listvoid insert(list_ptr *ptr, list_ptr node){
list_ptr temp;temp = (list_ptr)malloc(sizeof(struct list_node));if(IS_FULL(temp)){
fprintf(stderr,“The heap memory is full\n ”);exit(1);
}temp->data = 50;if(*ptr){ // non-empty
if(node){temp->link = node->link;node->link = temp;
}else{// as the first node
temp->link = *ptr;*ptr = temp;
}}else{// empty
temp->link = NULL;*ptr = temp;
}}
16
Delete
void delete(list_ptr *ptr, list_ptr trail list_ptr node){
if(trail){ // previous node existstrail->link = node->link;
}else{
*ptr = (*ptr)->link;}free(node);
}
17
18
Bubble Sort
19
void bubble_sort(element list[], int n){bool flag = 1;element next;for( int i = n-1; flag; i--){
flag = false;for(int j = 0; j < i; j++){
if(list[j] > list[j+1]){swap(&list[j], &list[j+1]);flag = true;
}}
}
Bubble Sort
20
Bubble Sort
최악의 경우,
모든 숫자가 정렬되려면 총 (n-1)+(n-2)+....+3+2+1의 작업이 필요하다.
21
Insertion Sort
• 이미 정렬된 segment에 원소를 맞는 위치에 삽입하는 알고리즘
• 원소가 하나면 이미 정렬 되어 있다고 생각하고, 맞는 위치에 삽입
• O(𝑛2)
22
for(i=1;i<LEN;i++) {temp = s[i];j = i-1;while(j>=0 && s[j] > temp) {
s[j+1] = s[j];j=j-1;
}s[j+1] = temp;
}
Insertion Sort
23
Quick Sort
• n < = 1 이 면 정 렬 된 것 으 로 생 각
• n > 1 이 면 n 개 의 원 소 를 l e f t , m i d d l e , r i g h t 로 Pa r t i t i o n
• M i d d l e s e g m e n t = P i v o t
• L e f t s e g m e n t 의 모 든 원 소 < = P i v o t
• R i g h t s e g m e n t 의 모 든 원 소 > = P i v o t
• S e g m e n t 의 n < = 1 일 때 끝 !
• O ( n l o g n )
24
Quick Sortvoid quick_sort(int* array, int start, int end){
if(start>=end) return;int mid=(start+end)/2;int pivot=array[mid];swap(&array[start],&array[mid]);int p=start+1,q=end;while(1){
while(array[p]<=pivot){ p++; }while(array[q]>pivot){ q--; }if(p>q) break;swap(&array[p],&array[q]);
}swap(&array[start],&array[q]);quick_sort(array,start,q-1);quick_sort(array,q+1,end);
}
25
Heap Sort1. 과정
i) 배열로 이진트리를 생성
ii) parent node가 child node보다 크게 sort= 가장 큰 원소가 root node의 위치에 오게 됨
iii) root node와 last node의 위치 교환
iv) parent node가 child node보다 크게 sort를 반복한다
26
Heap Sortvoid build_Heap(int H[],int n){
int i,j,k,v,heap;for(i=n/2;i>=1;i--) {
k=i;v=H[k];heap=0;while(heap==0 && (2*k)<=n){
j=2*k;if(j<n) {
if(H[j]<H[j+1])j++;
}if(v>=H[j])
heap=1;else {
H[k]=H[j];k=j;
}}H[k]=v;
}}
void HeapSort(int H[],int n) {int t,i;for(i=n;i>=1;i--) {
build_Heap(H,i);t=H[1];H[1]=H[i];H[i]=t;
}}
27
Merge Sort
1. 과정
i) 하나의 큰 리스트은 두 개의 큰 배열로 분할(그 안은 하나의 원소로 분할)
ii) 나눠진 두 개의 큰 배열의 원소를 비교하면서새로운 배열을 만들어냄 (recursive하게)
2. 특징
- 초기 리스트가 정렬될 필요 없음
28
“문제를 나눌 수 없을 때까지 나누어서
각각을 풀면서 다시 합병해 문제의 답을 얻는 알고리즘.”
29
Divide : 문제가 분할이 가능한 경우, 2개 이상의 문제로 나눈다.
Conquer : 나누어진 문제가 여전히 분할이 가능하면, 또 다시 Divide를 수행한다.
그렇지 않으면 문제를 푼다.
Combine : Conquer 한 문제들을 통합하여 원래 문제의 답을 얻는다.
문제를제대로나누면Conquer 하는것은쉽기에,Divide를제대로하는것이가장중요
재귀알고리즘을많이사용(효율성이다소떨어질수있음!)
30
TC(Time Complexity)
Sorting algorithm Average time Worst case time
Bubble sort O(n^2) O(n^2)
Insertion sort O(n^2) O(n^2)
Quick sort O(n log n) O(n^2)
Heap sort O(n log n) O(n log n)
Merge sort O(n log n) O(n log n)
Radix sort O(k·n) O(k·n)
31
32
33
• 분할정복
=> 하향식 해결법(Top-down), 나누어 진 부분들 사이에 서로 상관관계
가 없는 문제를 해결하는데 적합
• 큰 문제를 작은 문제로 나눠서 푸는 알고리즘 ( 작은 문제의
값을 이용해 큰 문제를 해결 )
• Memoization
34
* 두 가지 속성을 만족해야DP로 문제를 해결 할 수 있다.
1. Overlapping Subproblem
2. Optimal Substructure
35
특징 : 큰 문제를 작은 문제들로 나타낼 수있다.
[ 대표적 예 ]
Fibonacci Number
점화식 : F(n) = F(n-1) + F(n-2)
36
• 문제를 작은 문제로 쪼갤 수 있다 .
• 큰 문제와 작은 문제는 서로 상대적
• 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다 .
Overlapping Subproblem
37
• (큰) 문제의 정답을 작은 문제의 정답을이용해구할 수 있음
• 예시 )
서울에서 부산을 가는 가장 빠른 길이
[ 서울 -> 대전 -> 대구 -> 부산 ] 이라면
대전에서 부산을 가는 가장 빠른 길은
[ 대전 -> 대구 -> 부산 ]
Optimal Substructure
38
Optimal Substructure
* FibonacciNumber
N 번째피보나치수를구하는문제는
N-1, N-2번째피보나치수를구하는문제의합으로구할수 있다.
=> 작은문제의정답의합을이용해큰문제의정답을구할수있다.
39
Optimal Substructurefibonacci(n)을 n번째 피보나치 수를 구하는 함수라고가정하면,
* n 이 어떤 수인지 관계없이 fibonacci(5)는 항상 같음.
=> Optimal Substructure 의상황에서,
작은 문제들의 정답은 어떤 상황에서도일정
• n = 10 일 때,5번째 피보나치 수 = ?
• n = 8 일 때, 5번째 피보나치 수 = ?
• n = 7 일 때, 5번째 피보나치 수 = ?
40
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(3)
F(1) F(0)
F(2) F(1)
F(5)
F(6)Fibonacci(6) 호출과정
41
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(3)
F(1) F(0)
F(2) F(1)
F(5)
F(6)Fibonacci(6) 호출과정
42
F(4)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(4)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(3)
F(1) F(0)
F(3) F(2)
F(3) F(2) F(2) F(1)
F(5)
F(6)
중복되는 계산이 많다
Fibonacci(6) 호출과정
F(4)
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(3)
F(1) F(0)
F(2) F(1)
F(5)
F(6)중복계산없애기
F(4)
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1) F(0)F(1)
F(3)
F(5)
F(6)중복계산없애기
F(4)
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1)
F(3)
F(5)
F(6)중복계산없애기
F(4)
F(4)
F(3) F(2)
F(1) F(0)
F(2) F(1)
F(3)
F(5)
F(6)
중복계산을줄일수있다!
중복계산없애기
47
- 답을 구한 다음 어딘가에 메모해두는 방법
- 동일한 계산 반복 시, 이전에 계산한 값을 저장해 반복 수행을 제거
- 프로그램 실행 속도를 빠르게 함 (중복 계산 X)
- 다이나믹 프로그래밍의 핵심
- 코드 구현에 있어서 배열에 저장하는 방법을 주로 사용
Memoization
48
Top-down
• 큰 문제를 작은 문제로 나누고, 작은 문제들을 푼 다음 큰 문제를 푼다
• 재귀 호출 이용
49
Bottom-up
• 크기가 작은 문제부터 차례대로 풀고 크기를 키우면서
점차 큰 문제들을 해결하는 방법
• For 문 이용
50
LIS (Longest Increasing Subsequence)
TC: O(𝐧𝐥𝐨𝐠𝐧)인경우
Lower Bound 이용하는방법
51
LIS (Longest Increasing Subsequence)
52
LIS (Longest Increasing Subsequence)
53
LIS (Longest Increasing Subsequence)
54
LIS (Longest Increasing Subsequence)
55
LIS (Longest Increasing Subsequence)
56
LIS (Longest Increasing Subsequence)
57
LIS (Longest Increasing Subsequence)
58
LIS (Longest Increasing Subsequence)
memo[0] = -1; size = 0, lower = -1;
for(int i=1; i<=N; i++){ // (index == 1) 에 첫 번째 원소 존재if(memo[size] < data[i]){size++; memo[size] = data[i];continue;}
//lower_bound() : data[i]가 들어갈 위치(주소), -memo : index 리턴lower = lower_bound(memo+1, memo+size+1, data[i]) - memo; memo[lower] = data[i];
}
59
60
61
62
63
64
65
V , E 입력
Ti : V개의 입력 받음 (음주운전 단속시 걸리는시간)
V1, Ei ,V2 (E는 v1, v2연결하는 edge의 weight, 분단위)
테스트 케이스 수
테스트 케이스들시작 도착
66
V1
V2
V3V4
V5
V6
V7
V8
V1-> V5 : 3+6+2=11 // 3+6+6+2=173+3+1=10 // 3+3+3+8+1=18
67
68
69
70
71
72
73
74
75
76
77
78
79