본문 바로가기

알고리즘(Algorithm)/Algorithm

(14)
[알고리즘] 이진 탐색 트리 컴퓨터에서 탐색은 레코드(record)의 집합에서 특정한 레코드를 찾아내는 작업을 뜻한다. 레코드는 하나 이상의 필드(field)로 구성된다. 예를 들어, 한 학생의 정보를 구조체로 저장한다면, 구조체가 레코드고 이름, 학번, 학과 등등이 필드가 된다. 레코드를 서로 구별하기 위해서는 필드들 중에서 서로 중복되지 않는 고유한 값이 필요한데, 이를 키(key)라고 한다. 이진 탐색 트리는 다음과 같은 특징을 지니는 이진 트리이다. 1. 이진 탐색 트리의 각 노드는 키 값을 하나씩 가진다. 또한 각 노드의 키 값은 달라야한다. 2. 최상위 레벨에는 루트 노드가 있고, 각 노드는 최대 두 개의 자식 노드를 가진다. 3. 각 노드의 키 값은 왼쪽에 있는 모든 노드의 키 값보다 크고, 오른쪽에 있는 모든 노드의 ..
[알고리즘] 선형 시간 선택 알고리즘 10개의 원소를 갖는 아래와 같은 배열이 있다. 이 배열에서 i번째의 값을 찾는다고 해보자. arr[10] = { 10, 2, 5, 7, 6, 4, 8, 1, 9, 3 } 우선 배열을 한 번씩은 다 훑어봐야 하므로 적어도 n에 비례하는 시간이, 즉 \(\Omega(n)\)이 될것이다. 정렬을 한다면 \(O(nlogn)\)일 것이다. 어떤 시간에서든 선형 시간에 가능하도록 보장해줄 수 있도록 하는 알고리즘이 없을까? 이를 가능하도록 하는 알고리즘이 바로 선형 시간 선택 알고리즘이다. 평균 선형 시간 선택 알고리즘 선택 알고리즘은 퀵 정렬에서 사용했던 분할 알고리즘을 사용한다. 위의 경우에서 분할 알고리즘을 사용한다면 i번째 값을 찾을 수 있다. 기준원소를 5로 하고, 3번째로 작은 원소를 찾는다고 해보자...
[알고리즘] 정렬(3) - 기수 정렬, 카운팅 정렬 \(\Theta(n^2)\)와 \(\Theta(nlogn)\)이 소요되는 정렬 알고리즘들을 알아봤다. 이번에는 특수한 상황에서 사용할 수 있는 알고리즘을 살펴보겠다. 기수 정렬(Radix Sort) 기수 정렬이란 입력이 모두 k 자릿수 이하의 자연수인 경우에 사용할 수 있는 알고리즘이다. 가장 낮은 자릿수만으로 수를 정렬한 뒤, 다음 자릿수로 정렬, ... 를 반복해서 정렬된 배열을 얻는 방법이다. 이때, 같은 수라면 먼저 들어간 수가 위로 정렬된다. C++로 구현한 기수 정렬 const int PLACE_VALUE = 10; const int DIGIT = 2; void radix_sort(int* arr, int start, int end) { std::queue k[PLACE_VALUE]; // 자..
[알고리즘] 정렬(2) - 병합 정렬, 퀵 정렬, 힙 정렬 앞에서는 시간 복잡도가 \(\Theta(n^2)\)인 정렬 알고리즘들을 알아봤다. 이번에는 \(\Theta(nlogn)\)인 알고리즘들을 알아보자. 병합 정렬(Merge Sort) 병합 정렬은 먼저 입력을 절반으로 나눈다. 이후 그 두 덩이를 각각 정렬한 뒤, 서로 합쳐서 정렬하는 방식이다. 나뉘어진 두 덩어리도 다시 반으로 나눈 뒤 정렬하고 병합하고, 또 그 나누어진 덩이를 나누는 과정을 반복한다. 즉, 정렬 과정을 재귀적으로 반복하는 방법이다. 3 2 4 1 우선 절반을 가른다. 3 2 4 1 각각을 또 절반으로 가른다. 3 2 4 1 왼쪽과 오른쪽에서 자른 덩어리를 합하며 정렬한다. 2 3 1 4 나머지 덩어리를 합하며 정렬한다. 1 2 3 4 정렬이 끝난 배열 1 2 3 4 C++로 구현한 병합정..
[알고리즘] 정렬(1) - 선택 정렬, 버블 정렬, 삽입 정렬 정렬은 정해진 순서대로 나열하는 것이다. 학교에 처음 갔을 때 키 순서대로 자리를 배치하는 것이 좋은 예이다. 컴퓨터에서 정렬 알고리즘은 시간 복잡도가 Θ(\(n^2\))인 것 부터, Θ(\(nlogn\)), Θ(\(n\))등 여러가지 알고리즘이 있다. 각각의 알고리즘들을 알아보면서 직접 구현하는 시간을 가져보겠다. 모든 예시코드에는 공통적으로 아래의 배열을 예시로 정렬 알고리즘을 구현할 것이다. const int SIZE = 10; int arr[SIZE] = { 6, 2, 9, 7, 3, 10, 4, 1, 8, 5 }; 선택 정렬(Selection Sort) 가장 큰 원소를 찾은 후, 맨 뒷자리에 있는 원소와 자리를 바꾸는 정렬 알고리즘이다. 가장 큰 원소의 이동이 끝나면, 다음으로 큰 원소를 마지막..
[알고리즘] 알고리즘 알고리즘 알고리즘이란 어떤 입력을 받아 원하는 결과를 이끌어내는 과정을 기술한 것이다. 어떠한 문제가 주어졌을 때 이 문제를 해결하는 절차가 알고리즘이 되는 것이다. 알고리즘은 아래의 조건을 만족해야 한다. 입력 : 0개 이상의 입력이 존재해야 한다. 출력 : 1개 이상의 출력이 존재해야 한다. 명확성 : 각 명령어의 의미는 모호하지 않고 명확해야 한다. 유한성 : 유한한 단계를 거친 후 반드시 종료되어야 한다. 효율성 : 각 명령어들은 실행 가능한 연산이어야 한다. 시간 복잡도 시간 복잡도란 알고리즘의 실행 시간을 분석한 척도를 말한다. 시간 복잡도가 클 수록 알고리즘의 실행 시간이 길어진다는 뜻이다. 이 시간 복잡도는 실행에 필요한 연산의 수를 \(n\)으로 하는 함수 \(T(n)\)으로 나타낸다. ..