79
1

[D2CAMPUS] Algorithm tips - ALGOS

Embed Size (px)

Citation preview

Page 1: [D2CAMPUS] Algorithm tips - ALGOS

1

Page 2: [D2CAMPUS] Algorithm tips - ALGOS

2

Tree

“트리는 계층적 관계(Hierarchical

Relationship)를 표현하는 자료구조이다.”

Page 3: [D2CAMPUS] Algorithm tips - ALGOS

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 단말 노드를 제외한 모든 노드

Page 4: [D2CAMPUS] Algorithm tips - ALGOS

4

Page 5: [D2CAMPUS] Algorithm tips - ALGOS

5

Height and Depth

height depth

Page 6: [D2CAMPUS] Algorithm tips - ALGOS

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

Page 7: [D2CAMPUS] Algorithm tips - ALGOS

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

Page 8: [D2CAMPUS] Algorithm tips - ALGOS

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)

Page 9: [D2CAMPUS] Algorithm tips - ALGOS

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);}

Page 10: [D2CAMPUS] Algorithm tips - ALGOS

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);}

Page 11: [D2CAMPUS] Algorithm tips - ALGOS

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;

}

Page 12: [D2CAMPUS] Algorithm tips - ALGOS

12

Linked list

연결 리스트, 링크드 리스트(linked list)는

각 노드가 데이터와 포인터를 가지고

한 줄로 연결되어 있는 방식으로 데이터를 저장하는

자료 구조이다.

Page 13: [D2CAMPUS] Algorithm tips - ALGOS

13

배열과 연결리스트의 차이점

배열의 특성은 메모리공간에서 연속이라는 점이다.

그래서 빠른 속도가 보장되지만, 메모리가 연속이어야 하기 때문에삽입과 삭제가 번거롭다.

하지만 연결리스트는 메모리상에 연속이지 않아도 된다.

왜냐하면 다음 데이터에 대한 링크 정보를 지니고 있기 때문이다.

Page 14: [D2CAMPUS] Algorithm tips - ALGOS

14

연결 리스트에 사용할 구조체 선언

typedef struct list_node {

int data; // 노드에 저장될 데이터

list_pointer link; // 다음 순서의 노드를 가리킴

}

Page 15: [D2CAMPUS] Algorithm tips - ALGOS

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;

}}

Page 16: [D2CAMPUS] Algorithm tips - ALGOS

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);

}

Page 17: [D2CAMPUS] Algorithm tips - ALGOS

17

Page 18: [D2CAMPUS] Algorithm tips - ALGOS

18

Bubble Sort

Page 19: [D2CAMPUS] Algorithm tips - ALGOS

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

Page 20: [D2CAMPUS] Algorithm tips - ALGOS

20

Bubble Sort

최악의 경우,

모든 숫자가 정렬되려면 총 (n-1)+(n-2)+....+3+2+1의 작업이 필요하다.

Page 21: [D2CAMPUS] Algorithm tips - ALGOS

21

Insertion Sort

• 이미 정렬된 segment에 원소를 맞는 위치에 삽입하는 알고리즘

• 원소가 하나면 이미 정렬 되어 있다고 생각하고, 맞는 위치에 삽입

• O(𝑛2)

Page 22: [D2CAMPUS] Algorithm tips - ALGOS

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

Page 23: [D2CAMPUS] Algorithm tips - ALGOS

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 )

Page 24: [D2CAMPUS] Algorithm tips - ALGOS

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);

}

Page 25: [D2CAMPUS] Algorithm tips - ALGOS

25

Heap Sort1. 과정

i) 배열로 이진트리를 생성

ii) parent node가 child node보다 크게 sort= 가장 큰 원소가 root node의 위치에 오게 됨

iii) root node와 last node의 위치 교환

iv) parent node가 child node보다 크게 sort를 반복한다

Page 26: [D2CAMPUS] Algorithm tips - ALGOS

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;

}}

Page 27: [D2CAMPUS] Algorithm tips - ALGOS

27

Merge Sort

1. 과정

i) 하나의 큰 리스트은 두 개의 큰 배열로 분할(그 안은 하나의 원소로 분할)

ii) 나눠진 두 개의 큰 배열의 원소를 비교하면서새로운 배열을 만들어냄 (recursive하게)

2. 특징

- 초기 리스트가 정렬될 필요 없음

Page 28: [D2CAMPUS] Algorithm tips - ALGOS

28

“문제를 나눌 수 없을 때까지 나누어서

각각을 풀면서 다시 합병해 문제의 답을 얻는 알고리즘.”

Page 29: [D2CAMPUS] Algorithm tips - ALGOS

29

Divide : 문제가 분할이 가능한 경우, 2개 이상의 문제로 나눈다.

Conquer : 나누어진 문제가 여전히 분할이 가능하면, 또 다시 Divide를 수행한다.

그렇지 않으면 문제를 푼다.

Combine : Conquer 한 문제들을 통합하여 원래 문제의 답을 얻는다.

문제를제대로나누면Conquer 하는것은쉽기에,Divide를제대로하는것이가장중요

재귀알고리즘을많이사용(효율성이다소떨어질수있음!)

Page 30: [D2CAMPUS] Algorithm tips - ALGOS

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)

Page 31: [D2CAMPUS] Algorithm tips - ALGOS

31

Page 32: [D2CAMPUS] Algorithm tips - ALGOS

32

Page 33: [D2CAMPUS] Algorithm tips - ALGOS

33

• 분할정복

=> 하향식 해결법(Top-down), 나누어 진 부분들 사이에 서로 상관관계

가 없는 문제를 해결하는데 적합

• 큰 문제를 작은 문제로 나눠서 푸는 알고리즘 ( 작은 문제의

값을 이용해 큰 문제를 해결 )

• Memoization

Page 34: [D2CAMPUS] Algorithm tips - ALGOS

34

* 두 가지 속성을 만족해야DP로 문제를 해결 할 수 있다.

1. Overlapping Subproblem

2. Optimal Substructure

Page 35: [D2CAMPUS] Algorithm tips - ALGOS

35

특징 : 큰 문제를 작은 문제들로 나타낼 수있다.

[ 대표적 예 ]

Fibonacci Number

점화식 : F(n) = F(n-1) + F(n-2)

Page 36: [D2CAMPUS] Algorithm tips - ALGOS

36

• 문제를 작은 문제로 쪼갤 수 있다 .

• 큰 문제와 작은 문제는 서로 상대적

• 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다 .

Overlapping Subproblem

Page 37: [D2CAMPUS] Algorithm tips - ALGOS

37

• (큰) 문제의 정답을 작은 문제의 정답을이용해구할 수 있음

• 예시 )

서울에서 부산을 가는 가장 빠른 길이

[ 서울 -> 대전 -> 대구 -> 부산 ] 이라면

대전에서 부산을 가는 가장 빠른 길은

[ 대전 -> 대구 -> 부산 ]

Optimal Substructure

Page 38: [D2CAMPUS] Algorithm tips - ALGOS

38

Optimal Substructure

* FibonacciNumber

N 번째피보나치수를구하는문제는

N-1, N-2번째피보나치수를구하는문제의합으로구할수 있다.

=> 작은문제의정답의합을이용해큰문제의정답을구할수있다.

Page 39: [D2CAMPUS] Algorithm tips - ALGOS

39

Optimal Substructurefibonacci(n)을 n번째 피보나치 수를 구하는 함수라고가정하면,

* n 이 어떤 수인지 관계없이 fibonacci(5)는 항상 같음.

=> Optimal Substructure 의상황에서,

작은 문제들의 정답은 어떤 상황에서도일정

• n = 10 일 때,5번째 피보나치 수 = ?

• n = 8 일 때, 5번째 피보나치 수 = ?

• n = 7 일 때, 5번째 피보나치 수 = ?

Page 40: [D2CAMPUS] Algorithm tips - ALGOS

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) 호출과정

Page 41: [D2CAMPUS] Algorithm tips - ALGOS

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) 호출과정

Page 42: [D2CAMPUS] Algorithm tips - ALGOS

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) 호출과정

Page 43: [D2CAMPUS] Algorithm tips - ALGOS

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)중복계산없애기

Page 44: [D2CAMPUS] Algorithm tips - ALGOS

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)중복계산없애기

Page 45: [D2CAMPUS] Algorithm tips - ALGOS

F(4)

F(4)

F(3) F(2)

F(1) F(0)

F(2) F(1)

F(3)

F(5)

F(6)중복계산없애기

Page 46: [D2CAMPUS] Algorithm tips - ALGOS

F(4)

F(4)

F(3) F(2)

F(1) F(0)

F(2) F(1)

F(3)

F(5)

F(6)

중복계산을줄일수있다!

중복계산없애기

Page 47: [D2CAMPUS] Algorithm tips - ALGOS

47

- 답을 구한 다음 어딘가에 메모해두는 방법

- 동일한 계산 반복 시, 이전에 계산한 값을 저장해 반복 수행을 제거

- 프로그램 실행 속도를 빠르게 함 (중복 계산 X)

- 다이나믹 프로그래밍의 핵심

- 코드 구현에 있어서 배열에 저장하는 방법을 주로 사용

Memoization

Page 48: [D2CAMPUS] Algorithm tips - ALGOS

48

Top-down

• 큰 문제를 작은 문제로 나누고, 작은 문제들을 푼 다음 큰 문제를 푼다

• 재귀 호출 이용

Page 49: [D2CAMPUS] Algorithm tips - ALGOS

49

Bottom-up

• 크기가 작은 문제부터 차례대로 풀고 크기를 키우면서

점차 큰 문제들을 해결하는 방법

• For 문 이용

Page 50: [D2CAMPUS] Algorithm tips - ALGOS

50

LIS (Longest Increasing Subsequence)

TC: O(𝐧𝐥𝐨𝐠𝐧)인경우

Lower Bound 이용하는방법

Page 51: [D2CAMPUS] Algorithm tips - ALGOS

51

LIS (Longest Increasing Subsequence)

Page 52: [D2CAMPUS] Algorithm tips - ALGOS

52

LIS (Longest Increasing Subsequence)

Page 53: [D2CAMPUS] Algorithm tips - ALGOS

53

LIS (Longest Increasing Subsequence)

Page 54: [D2CAMPUS] Algorithm tips - ALGOS

54

LIS (Longest Increasing Subsequence)

Page 55: [D2CAMPUS] Algorithm tips - ALGOS

55

LIS (Longest Increasing Subsequence)

Page 56: [D2CAMPUS] Algorithm tips - ALGOS

56

LIS (Longest Increasing Subsequence)

Page 57: [D2CAMPUS] Algorithm tips - ALGOS

57

LIS (Longest Increasing Subsequence)

Page 58: [D2CAMPUS] Algorithm tips - ALGOS

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];

}

Page 59: [D2CAMPUS] Algorithm tips - ALGOS

59

Page 60: [D2CAMPUS] Algorithm tips - ALGOS

60

Page 61: [D2CAMPUS] Algorithm tips - ALGOS

61

Page 62: [D2CAMPUS] Algorithm tips - ALGOS

62

Page 63: [D2CAMPUS] Algorithm tips - ALGOS

63

Page 64: [D2CAMPUS] Algorithm tips - ALGOS

64

Page 65: [D2CAMPUS] Algorithm tips - ALGOS

65

V , E 입력

Ti : V개의 입력 받음 (음주운전 단속시 걸리는시간)

V1, Ei ,V2 (E는 v1, v2연결하는 edge의 weight, 분단위)

테스트 케이스 수

테스트 케이스들시작 도착

Page 66: [D2CAMPUS] Algorithm tips - ALGOS

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

Page 67: [D2CAMPUS] Algorithm tips - ALGOS

67

Page 68: [D2CAMPUS] Algorithm tips - ALGOS

68

Page 69: [D2CAMPUS] Algorithm tips - ALGOS

69

Page 70: [D2CAMPUS] Algorithm tips - ALGOS

70

Page 71: [D2CAMPUS] Algorithm tips - ALGOS

71

Page 72: [D2CAMPUS] Algorithm tips - ALGOS

72

Page 73: [D2CAMPUS] Algorithm tips - ALGOS

73

Page 74: [D2CAMPUS] Algorithm tips - ALGOS

74

Page 75: [D2CAMPUS] Algorithm tips - ALGOS

75

Page 76: [D2CAMPUS] Algorithm tips - ALGOS

76

Page 77: [D2CAMPUS] Algorithm tips - ALGOS

77

Page 78: [D2CAMPUS] Algorithm tips - ALGOS

78

Page 79: [D2CAMPUS] Algorithm tips - ALGOS

79