알고리즘 설계 기법
알고리즘 설계 기법(algorithm design technique)은 계산 문제의 구조를 파악하고, 그 문제를 해결하는 알고리즘을 체계적으로 구성하기 위해 사용하는 일반화된 전략이다. 하나의 설계 기법은 특정 알고리즘 하나를 가리키는 것이 아니라, 여러 문제에서 반복해서 적용할 수 있...
알고리즘 설계 기법(algorithm design technique)은 계산 문제의 구조를 파악하고, 그 문제를 해결하는 알고리즘을 체계적으로 구성하기 위해 사용하는 일반화된 전략이다. 하나의 설계 기법은 특정 알고리즘 하나를 가리키는 것이 아니라, 여러 문제에서 반복해서 적용할 수 있는 문제 분해 방식, 해 선택 규칙, 상태 표현법 또는 탐색 절차를 제공한다.
같은 문제라도 어떤 설계 기법을 적용하느냐에 따라 알고리즘의 구조와 시간 복잡도, 공간 복잡도, 구현 난이도 및 해의 품질이 달라질 수 있다. 예를 들어 큰 문제를 독립적인 부분 문제로 나눌 수 있다면 분할 정복을 적용할 수 있고, 동일한 부분 문제가 반복되며 그 결과를 재사용할 수 있다면 동적 계획법으로 계산량을 줄일 수 있다. 각 단계의 국소적인 선택이 전체 최적해로 이어지는 성질을 증명할 수 있는 문제에는 탐욕 알고리즘을 적용할 수 있다.
알고리즘 설계는 일반적으로 문제의 입력과 출력, 허용되는 연산, 제약 조건과 최적화 목표를 정의하는 것에서 시작한다. 이후 문제에서 반복되는 구조와 불변 조건을 찾아 적절한 설계 기법을 선택하고, 알고리즘의 정확성을 증명한 뒤 시간과 공간 사용량을 분석한다. 따라서 설계 기법은 알고리즘 분석과 분리된 절차가 아니라, 알고리즘의 구성과 정확성 및 효율성을 함께 다루는 과정이다.
분할 정복, 탐욕법, 동적 계획법처럼 널리 사용되는 기법들은 서로 완전히 독립적이지 않다. 하나의 알고리즘이 여러 설계 기법을 결합하기도 하며, 같은 문제를 서로 다른 기법으로 해결한 뒤 계산 복잡도와 구현 특성을 비교하기도 한다. 무작위 선택을 분할 정복에 결합한 무작위 퀵 정렬, 동적 계획법의 상태 계산에 분할 정복 최적화를 적용하는 방식, 탐욕적 선택으로 근사해를 구성하는 근사 알고리즘 등이 이에 해당한다.
모든 문제에 항상 우월한 하나의 설계 기법이 존재하는 것은 아니다. 입력 규모, 부분 문제의 관계, 해 공간의 크기, 최적해의 필요 여부, 실시간 응답 조건, 사용 가능한 메모리와 병렬 실행 환경 등을 함께 고려해야 한다. 계산적으로 어려운 문제에서는 정확한 최적해 대신 근사해를 구하거나, 특정 매개변수가 작다는 조건을 활용하거나, 실제 입력에서 유용한 휴리스틱을 사용하는 방향으로 설계를 확장할 수 있다.
역사와 발전
초기 수학적 절차
계산 이론과 알고리즘 분석의 형성
범용 설계 패러다임의 정립
무작위화와 근사 기법의 발전
병렬·분산 환경으로의 확장
알고리즘 설계 과정
문제의 명세
입력과 출력의 정의
제약 조건과 계산 모델
문제 구조의 발견
자료구조의 선택
정확성 증명
복잡도 분석
구현과 검증
완전 탐색
기본 원리
해 공간의 열거
생성과 검사
중복 계산 제거
적용 사례
분할 정복
분할·정복·결합
재귀 관계
마스터 정리
균형 분할과 불균형 분할
대표적인 알고리즘
감소 정복
한 요소씩 감소하는 방식
일정 비율로 감소하는 방식
가변 크기 감소
분할 정복과의 관계
변환 정복
입력 표현의 변환
문제 단순화
전처리와 정렬
자료구조를 이용한 변환
탐욕 알고리즘
탐욕적 선택
최적 부분 구조
선택의 안전성
교환 논증
머트로이드와 탐욕법
대표적인 알고리즘
동적 계획법
중복되는 부분 문제
최적 부분 구조
상태와 점화식
메모이제이션
상향식 계산
해의 복원
상태 공간 최적화
대표적인 알고리즘
백트래킹
상태 공간 트리
후보 생성
제약 조건 검사
가지치기
휴리스틱을 이용한 탐색 순서
대표적인 알고리즘
분기 한정법
분기와 경계
상한과 하한
탐색 노드의 선택
백트래킹과의 관계
조합 최적화 문제
무작위 알고리즘
무작위 선택의 역할
라스베이거스 알고리즘
몬테카를로 알고리즘
기대 실행 시간
오류 확률과 증폭
대표적인 알고리즘
근사 알고리즘
최적화 문제와 근사해
근사비
탐욕적 근사
선형 계획법 기반 근사
무작위 반올림
근사 스킴
휴리스틱과 메타휴리스틱
휴리스틱의 역할
지역 탐색
담금질 기법
유전 알고리즘
금기 탐색
군집 지능
정확 알고리즘과의 결합
매개변수화 알고리즘
매개변수 복잡도
고정 매개변수 tractability
커널화
제한 탐색 트리
동적 계획법과의 결합
온라인 알고리즘
입력의 순차적 도착
미래 정보의 부재
경쟁 분석
캐시와 스케줄링
오프라인 알고리즘과의 비교
스트리밍 알고리즘
제한된 메모리 모델
단일 통과와 다중 통과
표본 추출
스케치 자료구조
근사 질의
병렬 알고리즘
작업 분할
작업량과 깊이
분할 정복의 병렬화
병렬 접두사 계산
동기화와 통신 비용
확장성
분산 알고리즘 설계
지역 정보와 전역 목표
메시지 전달
동기식·비동기식 모델
합의와 리더 선출
장애 허용
통신 복잡도
기하 알고리즘의 설계 기법
평면 훑기
회전 훑기
공간 분할
쌍대성 변환
무작위 증분 구성
문자열 알고리즘의 설계 기법
전처리와 접두사 정보
유한 오토마톤
해싱
동적 계획법
접미 구조
그래프 알고리즘의 설계 기법
그래프 탐색
완화
탐욕적 확장
동적 계획법과 그래프
네트워크 흐름
그래프 분해
수치 알고리즘의 설계 기법
반복법
수렴 조건
오차 분석
안정성
근사와 정밀도
설계 기법의 결합
분할 정복과 무작위화
탐욕법과 동적 계획법
탐색과 동적 계획법
분기 한정법과 휴리스틱
근사와 무작위화
전처리와 매개변수화
기법 선택 기준
부분 문제의 독립성
중복되는 부분 문제
탐욕적 선택 가능성
해 공간의 크기
최적해와 근사해
입력 규모와 분포
메모리 제약
실시간성과 온라인성
병렬성과 분산성
정확성 증명 기법
루프 불변식
수학적 귀납법
강한 귀납법
모순을 이용한 증명
교환 논증
귀류와 최소 반례
확률적 정확성
성능 분석
최선·평균·최악의 경우
점근적 분석
상환 분석
기대 복잡도
재귀 관계 분석
공간 복잡도
통신과 입출력 복잡도
실험적 성능 평가
구현상의 고려 사항
재귀와 반복
수치 오차
캐시 지역성
메모리 할당
병렬화 오버헤드
입력 검증
경계 조건
테스트와 벤치마크
장점과 한계
관련 문서