1. 통상적인 의미 ¶
문제를 해결하기 위한 절차나 방법. 이런거
이 단어는 아랍의 수학자인 알-콰리즈미(الخوارزمي)의 이름에서 유래했다고 알려졌다. 영어로는 algorism보다는 algorithm(알고리듬)으로 훨씬 더 자주 쓰지만 한국에서는 알고리듬보다는 알고리즘의 사용 빈도가 높다.[1]
알고리즘이라는 용어는 문제를 해결하기 위한 절차나 방법을 의미하는 단어로 넒은 범위에서 사용된다. 조금 더 정확한 의미를 따져보자면 알고리즘은 어떠한 행동을 하기 위해서 만들어진 명령어들의 유한 집합(finite set)이다.
컴퓨터 프로그램은 정교한 알고리즘들의 집합이라고 간주할 수 있다. 수학이나 컴퓨터 과학에서 말하는 알고리즘은, 보통 반복되는 문제를 풀기 위한 작은 프로시저를 의미한다.
컴퓨터 프로그램은 정교한 알고리즘들의 집합이라고 간주할 수 있다. 수학이나 컴퓨터 과학에서 말하는 알고리즘은, 보통 반복되는 문제를 풀기 위한 작은 프로시저를 의미한다.
2. 알고리즘의 조건 ¶
알고리즘은 이하의 요건을 만족해야만 한다.
- 입력 - 알고리즘은 0 또는 그 이상의 외부에서 제공된 자료가 존재한다.
- 출력 - 알고리즘은 최소 1개 이상의 결과를 가진다.
- 명확성 - 알고리즘의 각 단계는 명확하여 애매함이 없어야 한다.[2]
- 유한성 - 알고리즘은 단계들을 유한한 횟수로 거친 후 문제가 해결되고 종료되어야 한다. 알고리즘의 한 단계 이후 m의 값은 n 보다 작으며, m!=0이면 n의 값은 다음 번 단계에서 줄어든다.
- 효과성 - 알고리즘의 모든 연산들은 사람이 종이와 연필을 이용하여 유한한 시간 안에 정확하게 수행할 수 있을 정도로 충분히 단순해야 한다.
4. 알고리즘의 평가 ¶
알고리즘이 위의 조건들을 모두 만족한다면 문제를 풀 수 있다고 할 수 있지만, '효과적으로' 풀어낸다고 할 수는 없다. 위에서 말한 유한한 시간이 몇 달 혹은 몇 년이 될 수도 있기 때문이다. 따라서 우리는 알고리즘을 효율성으로 평가하게 되고, 컴퓨터에서는 시간과 메모리라는 두 자원을 얼마나 소모하는지가 효율성의 중점이 된다.
- 시간 복잡도(time complexity)
보통 O(n)의 알고리즘은 최상의 결과이고[5], log(n)의 지수승이 붙는 정도로 막으면(O(n log(n)) 등) 매우 바람직한 결과이다. O(n^3) 정도만 되도 큰 자료수에선 급격히 느려진다.
이런 식으로 시간복잡도가 n의 다항식 이하가 되는 알고리즘들을 다항 시간 알고리즘(polynomial time algorithm)이라고 한다. 여기까지만 보면 다항식과는 넘사벽[6]의 증가속도를 자랑하는 O(2n ) 또는 O(n!) 같은 알고리즘은 매우 막장인 것처럼 보이지만, 세상에는 이 따위 알고리즘밖에 방법이 없는 어려운 문제들이 수두룩하다. 더 자세한 이야기는 P-NP 문제 참고.
이런 식으로 시간복잡도가 n의 다항식 이하가 되는 알고리즘들을 다항 시간 알고리즘(polynomial time algorithm)이라고 한다. 여기까지만 보면 다항식과는 넘사벽[6]의 증가속도를 자랑하는 O(2n ) 또는 O(n!) 같은 알고리즘은 매우 막장인 것처럼 보이지만, 세상에는 이 따위 알고리즘밖에 방법이 없는 어려운 문제들이 수두룩하다. 더 자세한 이야기는 P-NP 문제 참고.
- 공간 복잡도(space complexity)
5.3. 마방진 ¶
홀수 마방진의 경우 대각선으로 숫자를 써가면서 다 채운 다음에 상하좌우에 튀어나온 숫자들을 반대편으로 넘기면 끝난다. 뿌리깊은 나무에서 어린 세종이 이걸 스스로 찾아내는 장면이 나온다.
6. 프로그래밍에서 사용하는 알고리즘들 ¶
- 자료구조: 정렬, 탐색, 각종 트리(tree)와 힙(heap)
- 알고리즘 패러다임: DFS, 백트래킹, 다이나믹 프로그래밍
- 그래프 알고리즘: 탐색, 최단 거리 찾기, 네트워크 흐름(network flow) 알고리즘
- 기타 KMP 등의 문자열 매칭, Pollard's rho 등의 정수론 알고리즘, 해석기하/그래픽 알고리즘 등등.
----
- [1] 2012년 10월 16일 구글 '다음 단어 또는 문구 정확하게 포함' 검색 결과: "algorithm" 124,000,000건, "algorism" 760,000건, "알고리듬" 290,000건, "알고리즘" 4,510,000건
- [2] 이 조건에 의해 난수가 알고리즘에 포함되지 않을 것 같으나, 컴퓨터에서의 난수는 이전 결과를 이용하는 의사 난수이기 때문에 알고리즘에 포함된다.
- [3] 의사코드(pseudocode)가 이 범주에 들어간다
- [4] 자세한 asymptotic이나 O-표기법의 이론은 생략한다.
- [5] 대부분의 경우 자료를 읽는 데에 어쨌든 n의 시간이 필요하므로. 물론 검색알고리즘에서 O(n)은 최악.
- [6] 굳이 표현하자면 n < n log n << n2 <<< n3 <<<< n4 <<<<<< (넘사벽) <<<<< 2n <<<<<<<<<<<<< (넘사벽) <<<<<<<<<<<<<<<<<<< n! 정도가 되지 않을까.
- [7] 앞에 넘사벽처럼 어렵다고 한 문제들 이상의 우주급 넘사벽이 있다!