탐욕법 (greedy method)

가장 직관적인 알고리즘 설계 패러다임

우리가 원하는 답을 재귀 호출과 똑같이 여러 개의 조각으로 쪼개고,
각 단계마다 답의 한 부분을 만들어 간다는 점에서 완전 탐색이나 동적 계획법 알고리즘과 다를 것이 없다.
But, 탐욕법은 각 단계마다 지금 당장 가장 좋은 방법만을 선택 하는 방법.

주의할점
탐욕적 알고리즘은 많은 경우 최적해를 찾지 못함.

탐욕적 알고리즘이 사용되는 경우

  1. 탐욕법을 사용해도 항상 최적해를 구할 수 있는 문제를 만난 경우
    탐욕법은 동적 계획법보다 수행 시간이 훨씬 빠르기 때문에 유용함.

  2. 시간이나 공간적 제약으로 인해 다른 방법으로 최적해를 찾기가 너무 어려운 경우
    최적해 대신 적당히 괜찮은 답(근사해)을 찾는 것으로 타협할 수 있음.


프로그래밍 대회에서는 주로 1번 용도로만 사용됨.
=> 근사해를 찾는 문제는 주어지지 않음..


탐욕법 vs 동적 계획법

사실, 탐욕법으로 최적해를 찾을 수 있는 많은 문제들은 동적 계획법으로도 풀 수 있음.

 탐욕법

 

 동적 계획법

하나의 경우만 고려해서 답을 얻는 방법

  

모든 경우의 수를 다 찾아 답을 얻는 방법


따라서 동적 계획법으로 탐욕법이 고려하는 경우를 커버하기 때문에 가능함.

하지만 동적 계획법에 필요한 메모리나 시간이 과도하게 큰 경우는 탐욕법을 사용해야 할 수도 있음.

'스터디 > 알고리즘 정리' 카테고리의 다른 글

동적 계획법 테크닉 (not yet)  (0) 2018.12.02
동적 계획법 문제 풀이 (not yet)  (0) 2018.12.02
동적 계획법  (0) 2018.12.01
분할 정복  (0) 2018.11.27
알고리즘 시간 복잡도  (0) 2018.11.26


'스터디 > 알고리즘 정리' 카테고리의 다른 글

탐욕법  (0) 2018.12.02
동적 계획법 문제 풀이 (not yet)  (0) 2018.12.02
동적 계획법  (0) 2018.12.01
분할 정복  (0) 2018.11.27
알고리즘 시간 복잡도  (0) 2018.11.26


'스터디 > 알고리즘 정리' 카테고리의 다른 글

탐욕법  (0) 2018.12.02
동적 계획법 테크닉 (not yet)  (0) 2018.12.02
동적 계획법  (0) 2018.12.01
분할 정복  (0) 2018.11.27
알고리즘 시간 복잡도  (0) 2018.11.26

동적 계획법

현재 문제를 작은 문제로 나눈 뒤 작은 문제의 답을 구하고,
작은 문제로부터 현재 문제의 답을 구하는 알고리즘

분할정복 vs 동적 계획법

동적 계획법은 현재 문제를 부분문제로 나눈 뒤 현재 문제의 답을 구한다는 점에서 분할정복과 비슷하지만


분할 정복은 부분문제를 한번만 계산하게 되는 반면,

동적 계획법은 같은 부분문제를 여러 차례 계산한다.


따라서 중복적인 계산을 피하기 위해 메모이제이션 기법이 반드시 필요하며, 

두번 이상 계산되는 부분문제를 중복되는 부분문제 (overlapping subproblems) 라고 부른다.



(a)는 분할 정복 (b)는 동적 계획법



메모이제이션

동적 계획법의 반복적인 부분 문제 계산 예


bino(2, 1)은 

  • bino(3, 1) 을 계산할 때 필요
  • bino(2, 1) 을 계산할 때도 필요


입력 n과 r 이 정해져 있을 떄 bino(n, r) 의 반환값이 일정


∴ 한번 계산한 값을 저장해 뒀다가 재활용하는 최적화 기법을 사용해야 함


이와 같이 

두번이상 반복 계산되는 부분 문제들의 답을 미리 저장함으로써, 속도의 향상을 꾀하는 알고리즘 설계 기법을 동적 계획법이라고 한다.



메모이제이션 주의 할 점

메모하려는 값이 참,거짓 이어도 불리언 타입으로 메모이제이션을 하면 안됨.
불리언 배열을 캐시로 사용해서는 아직 계산되지 않은 상태인지 아닌지 알 수 없기 때문.
따라서 캐싱을 정수형으로 1, 0 값을 가진다고 설계하고 -1 로 초기화 하여 사용.



최적화 동적 계획법 레시피

  1. 모든 답을 만들어 보고 그 중 최적해의 점수를 반환하는 완전 탐색 알고리즘을 설계한다.
  2. 전체의 값을 반환하는 것이 아니라, 앞으로 남은 선택들에 해당하는 값 만을 반환하도록 부분 문제 정의를 바꾼다.
  3. 재귀 호출의 입력에 이전 선택에 관련된 정보가 있다면 꼭 필요한 것만 남기고 줄인다.
    문제가 최적 부분 구조에 성립할 경우에는 이전 선택에 관련된 정보를 완전히 없앨 수도 있다.
    입력의 정보가 줄어들면 줄어들수록 더 많은 부분 문제가 중복되고, 따라서 메모이제이션을 최대한 활용할 수 있다.
  4. 입력이 배열이거나 문자열인경우 가능하다면 적절한 변환을 통해 메모이제이션을 이용할 수 있도록 한다.
  5. 메모이제이션을 적용한다.



'스터디 > 알고리즘 정리' 카테고리의 다른 글

탐욕법  (0) 2018.12.02
동적 계획법 테크닉 (not yet)  (0) 2018.12.02
동적 계획법 문제 풀이 (not yet)  (0) 2018.12.02
분할 정복  (0) 2018.11.27
알고리즘 시간 복잡도  (0) 2018.11.26

p. 175 ~ p. 205


분할 정복

  1. 주어진 문제를 둘 이상의 부분문제로 나눈 뒤, (Divide)
  2. 각 문제의 답을 재귀호출을 통해 계산 후 (Merge)
  3. 각 답으로부터 원래 문제의 답을 계산하는 알고리즘 (Base case)

순수 재귀호출 방식과 다른 점

 재귀호출

 분할 정복

 1 문제 + 나머지 (재귀호출)

 부분문제 (재귀호출) + 부분문제 (재귀호출)

 1 ~ N 합

 N 번의 호출

 lgN 번의 호출

  sum(n-1) + n

  •  2 * sum(n / 2) + (n / 2) * (n / 2)  (if, n 짝수)
  •  sum(n - 1) + n                         (if, n 홀수)



병합 정렬과 퀵 정렬

 병합 정렬 (Merge Sort)

퀵 정렬 (Quick Sort)

 O(nlgn)

 O(nlgn)

 병합 단계에서 연산 수행

 분할 단계에서 연산 수행

 

 pivot 잘못 선택 시 최악의 경우 O(n²) 이 될 수 있음






문제

쿼드 트리 뒤집기





울타리 잘라내기





'스터디 > 알고리즘 정리' 카테고리의 다른 글

탐욕법  (0) 2018.12.02
동적 계획법 테크닉 (not yet)  (0) 2018.12.02
동적 계획법 문제 풀이 (not yet)  (0) 2018.12.02
동적 계획법  (0) 2018.12.01
알고리즘 시간 복잡도  (0) 2018.11.26

p.91 ~ p.126

반복문

알고리즘의 수행시간을 지배하는 것은 반복문

반복문의 수행 횟수는 입력의 크기에 대한 횟수로 표현


수행시간에 따른 알고리즘 분류

선형 시간 알고리즘

입력의 크기에 대비해 걸리는 시간을 그래프로 그리면 직선인 경우.

우리가 찾는 좋은 알고리즘.


선형 이하 시간 알고리즘

N을 계속 절반으로 나누는 일을 1이하가 될때까지 지속

lgN: 100,000 을 17번만 나누면 1에 도달 함

ex) 이진 탐색 알고리즘

  • 정렬이 필요 A[ ]
  • A[i-1] < x <= A[i]


다항 시간 알고리즘

반복문의 수행 횟수를 다항식으로 표현

대다수의 알고리즘에 해당


지수 시간 알고리즘

완전탐색 방식, 재귀호출을 통해 할지 말지 결정하는 알고리즘

ex) DFS

n 가지 경우, 모든 조합의 수 2ⁿ, 조합이 맞는지 여부 체크 m*n

∴ 재귀호출() 2ⁿ + isValid() m*n = mn2ⁿ

입력으로 주어지는 숫자의 갯수가 아닌 숫자의 값에 따라 지수시간이 될 수도 있음




시간 복잡도

시간복잡도가 높다

입력의 크기가 증가할 때 수행시간이 급격히 증가

시간복잡도가 낮다

입력의 크기가 증가해도 수행시간이 비슷



알고리즘 수행시간은 보통 최악의 시간을 측정



O 표기법 (Big-O Notation)

주어진 함수에서 가장 빨리 증가하는 항만을 남긴 채 나머지 다 버림



정렬 알고리즘

선택 정렬은 무조건 O(N²)

삽입 정렬은 O(N) ~ O(N²) 까지 입력에 따라 다름

∴ 대부분의 경우 삽이 정렬이 더 빠름

∴ 삽입 정렬은 O(N²) 정렬 중 가장 빠른 알고리즘



수행 시간 어림짐작하기

1초 ≒ 1억

ex)

N == 10,000

O(N³)X
O(N²)O
O(NlgN)O




알고리즘 선택에 따른 수행 시간 비교

문제) 1차원 배열 연속된 부분 구간의 합이 최대인 구간

완전 탐색: O(N³)

반복문 2개 + 메모이제이션: O(N²)

분할 정복 알고리즘: O(NlgN)

동적 계획법: O(N)

'스터디 > 알고리즘 정리' 카테고리의 다른 글

탐욕법  (0) 2018.12.02
동적 계획법 테크닉 (not yet)  (0) 2018.12.02
동적 계획법 문제 풀이 (not yet)  (0) 2018.12.02
동적 계획법  (0) 2018.12.01
분할 정복  (0) 2018.11.27

+ Recent posts