01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기...

11
01. 탐욕 알고리즘에 대하여 02. 편의점 점원의 거스름돈 줄이기 03. 크루스칼의 최소 신장 트리 알고리즘 다시 보기 04. 다익스트라의 최단 경로 알고리즘 다시 보기 05. 허프만 코딩을 이용한 데이터 압축

Upload: others

Post on 01-Mar-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

01. 탐욕 알고리즘에 대하여02. 편의점 점원의 거스름돈 줄이기

03. 크루스칼의 최소 신장 트리 알고리즘 다시 보기04. 다익스트라의 최단 경로 알고리즘 다시 보기

05. 허프만 코딩을 이용한 데이터 압축

Page 2: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

탐욕 알고리즘도 동적 계획법과 마찬가지로 최적화 문제의 답을 얻기 위해 사용

각 단계의 부분 문제를 풀 때 “근시안(近視眼)적”으로 최적해를 구한다

동적 계획법은 최적의 해를 구하긴 하지만 탐욕 알고리즘보다는 덜 효율적

탐욕 알고리즘은 동적 계획법보다 효율적이긴 하지만 동적 계획법처럼 반드시 최적의 해를 구해준다는 보장은 하지 못한다.

Page 3: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

탐욕 알고리즘의 동작 과정

1. 해 선택 : 현재 상태에서 부분 문제의 최적해를 구한 뒤, 이를 부분해 집합(Solution Set)에 추가한다.

2. 실행 가능성 검사 : 새로운 부분해 집합이 실행가능한지를 확인한다. 곧, 문제의 제약 조건을 위반하지 않는 지를 검사한다.

3. 해 검사 : 새로운 부분해 집합이 문제의 해가 되는지를확인한다. 아직 전체 문제의 해가 완성되지 않았다면 1의 해 선택부터 다시 시작한다.

Page 4: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

“어떻게 하면 손님에게 거스름돈으로 주는 지폐와 동전의 개수를최소한으로 줄일 수 있을까?”

1) 해 선택 : 여기에서는 멀리 내다볼 것 없이 가장 좋은 해를 선택한다. 단위가 큰 동전으로만 거스름돈을 만들면 동전의 개수가 줄어들므로 현재 고를 수 있는 가장 단위가 큰 동전을 하나 골라 거스름돈에 추가한다.

2) 실행 가능성 검사 : 거스름돈이 손님에게 내드려야 할 액수를 초과하는지 확인한다. 초과한다면 마지막에 추가한 동전을 거스름돈에서 빼고, 1)로 돌아가서 현재보다 한 단계 작은 단위의 동전을 추가한다.

3) 해 검사 : 거스름돈 문제의 해는 당연히 거스름돈이 손님에게 내드려야하는 액수와 일치하는 셈이다. 더 드려도, 덜 드려도 안되기 때문에 거스름돈을 확인해서 액수에 모자라면 다시 1)로 돌아가서 거스름돈에추가할 동전을 고른다.

Page 5: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

거스름돈을 만드는 탐욕 알고리즘은 항상 최적일까?

동전의 가짓수를 입력하세요 : 6[0] 번째 동전의 단위를 입력하세요 : 500[1] 번째 동전의 단위를 입력하세요 : 400[2] 번째 동전의 단위를 입력하세요 : 100[3] 번째 동전의 단위를 입력하세요 : 50[4] 번째 동전의 단위를 입력하세요 : 10[5] 번째 동전의 단위를 입력하세요 : 1물건 가격을 입력하세요 : 1200손님이 지불한 돈은 얼마입니까? : 2000

500원 : 1개400원 : 0개100원 : 3개50원 : 0개10원 : 0개1원 : 0개

동전의 가짓수를 입력하세요 : 5[0] 번째 동전의 단위를 입력하세요 : 500[1] 번째 동전의 단위를 입력하세요 : 100[2] 번째 동전의 단위를 입력하세요 : 50[3] 번째 동전의 단위를 입력하세요 : 10[4] 번째 동전의 단위를 입력하세요 : 1물건 가격을 입력하세요 : 1200손님이 지불한 돈은 얼마입니까? : 2000

500원 : 1개100원 : 3개50원 : 0개10원 : 0개1원 : 0개

최적인 경우도 있고, 최적이 아닌 경우도 있다. 즉, 항상 최적이지 않다.

Page 6: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

크루스칼 알고리즘은 다음의 두 단계로 동작한다.

1) 그래프 내의 모든 간선을 가중치의 오름차순으로 목록을 만든다.

2) 1)에서 만든 간선의 목록을 차례대로 순회하면서 간선을 최소 신장 트리에 추가한다. 단, 이때 추가된 간선으로 인해 최소 신장 트리 내에 사이클이 형성되면 안된다

크루스칼 알고리즘에서 탐욕적인 방법으로 처리되는부분은 2)단계.

크루스칼 알고리즘에서 간선 목록을 돌면서 최소 신장트리를 완성해 나가는 부분이 바로 “해 선택 - 실행 가능성 검사 – 해 검사”의 반복으로 이루어지는 곳

Page 7: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

다익스트라 알고리즘은 다음과 같이 동작한다.

1) 각 정점 위에 시작점으로부터 자신에게 이르는 경로의 길이를 저장할 곳을 준비하고 모든 정점위에 있는 경로의 길이를 ∞(무한대)로 초기화한다

2) 시작 정점의 경로 길이를 0으로 초기화하고(시작 정점에서 시작정점까지의 거리는 0이기 때문.) 최단 경로에 추가한다.

3) 최단 경로에 새로 추가된 정점의 인접 정점들에 대해 경로 길이를 갱신하고 이들을 최단 경로에추가한다. 만약 추가하려는 인접 정점이 이미 최단 경로 안에 존재한다면 갱신되기 이전의 경로길이가 새로운 경로의 길이보다 더 큰 경우에 한해, 다른 선행 정점을 지나던 기존의 경로를 현재 정점을 경유하도록 수정한다.

4) 그래프 내의 모든 정점이 최단 경로에 소속될 때까지 4) 과정을 반복한다.

위 알고리즘에서 1)과 2)는 사실 알고리즘의초기화 작업에 해당되고, 3)과 4)가 본격적으로 최단경로를 만드는 과정. 3)은 해 선택과 실행 가능성 검사, 4)는 해 검사를 맡고 있다.

이 알고리즘에서는 최단경로가 해집합이고, 각 정점이 부분 문제에 대한 해이다.

Page 8: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

고정 길이 코드(Fixed Length Code)◦ 모든 코드의 길이가 똑같은 값을 갖는 코드 체계

예) ASCII : 모든 코드가 8bit

◦ 다루기 쉽지만 저장 공간의 비효율적 활용

접두어 코드(Prefix Code)◦ 코드 집합의 어느 코드도 다른 코드의 접두어가 되지 않는 코드

◦ 다루기는 까다롭지만 저장공간을 효율적으로 활용◦ 예) a = 00, b = 010, c = 100, d = 101

“abcd” = 00010100101 just 11bit!◦ abcd를 ASCII 코드로 기록하면 32bit가 소요.

Page 9: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

허프만 코딩은 접두어 코드를 이용한 압축 알고리즘.

접두어 코드를 표현하기 위해 “허프만 트리”를 사용.◦ 왼쪽 자식 노드는 0, 오른쪽 자식 노드는 1, 루트 노드에서부터 잎노드까지의 경로가 해당 기호의 접두어 코드.

a

b c

d

0 1

0 1

0 1

0

100

101

11

Page 10: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

허프만 트리를 만드는 데 탐욕 알고리즘을 사용.

◦ 예) “aaabaacdd” : a의 빈도는 5, b는 1, c는 1, d는 2.◦ 이 빈도를 이용하여 다음과 같이 트리 노드를 생성

◦ 이 노드들 위에 부모 노드를 만들어 연결 시켜 나가면서 허프만 트리를 만든다. 이 때 탐욕 알고리즘의 3단계를 이용한다.

1) 해 선택2) 실행 가능성 검사3) 해 검사

a

5

b

1

c

1

d

2

Page 11: 01. 탐욕알고리즘에대하여 편의점점원의거스름돈줄이기 크루스칼의최소신장트리알고리즘…mclab.silla.ac.kr/lecture/201601/algorithm/ag_lecture_14.pdf ·

해 선택 : 선택 기준은 현 시점에서 빈도가 가장 작은 노드 두 개

실행 가능성 검사 : 기호를 가진 노드가 잎노드인가?

해 검사 : 트리가 완성되었는가?

a

5

b

1

c

1

d

2

b

1

2

c

1 a

5

d

2

b

1

b

1

2

1

c

4

c

1

2

d

2

a

5

b

1

4

c

1

2

d

2

9

a

5

2

d

2

c

1

b

1

4

9

a

5

2

d

2

c

1

b

1

4

0

100

11

101