본문 바로가기

분류 전체보기13

이진 트리 검색(Binary Tree Search) 이진 트리 검색(Binary Tree Search) 루트 노드를 기준으로 왼쪽 서브 트리는 루트 노드보다 키 값이 작은 원소들로, 오른쪽 서브 트리는 루트 노드보다 키 값이 큰 원소들로 구성된 '이진 탐색 트리'를 사용하여 중위 순회 방법으로 검색. 삽입, 삭제 연산 후에는 항상 이진 탐색 트리를 재구성해야 한다. ​ 예시 1) 20를 찾는 경우 9 /\ 4 17 /\ /\ 1 7 14 20 ​ 1. 루트 노드에서 검색을 시작하여 키 값과 비교한다. 키 값이 루트 노드보다 크기 때문에 오른쪽 노드로 이동한다. 9 /\ 4 17 /\ /\ 1 7 14 20 ​ 2. 이동한 오른쪽 노드와 키 값을 비교한다. 키 값이 17보다 크기 때문에 오른쪽 노드로 이동한다. 9 /\ 4 17 /\ /\ 1 7 14 20.. 2021. 4. 2.
이진 검색(Binary Search) 이진 검색(Binary Search) 정렬되어 있는 배열에 대하여 원소들의 가운데 있는 항목을 키 값과 비교하여 키 값이 더 크면 오른쪽을, 더 작으면 왼쪽을 검색한다. 왼쪽과 오른쪽으로 나누어서 검색하면서 이진 검색을 다시 반복하여 검색 범위를 반으로 줄여나가면서 검색한다. 절반 두 부분으로 나누어 검색하므로 이분 검색, 보간 검색(Interpolation Search)이라고도 하며 분할 정복 기법이라고도 한다. 삽입이나 삭제 작업을 수행한 후에 항상 배열을 정렬해야한다. 시간 복잡도는 O(log2n)이다. ​ 예시 1) 50을 찾는 경우 {2, 6, 16, 27, 32, 41, 50} ​ 1. 가운데 원소인 27을 기준으로 키 값과 비교한다. 키 값이 더 크기 때문에 검색 범위를 기준 값의 오른쪽으로.. 2021. 4. 2.
색인 순차 검색(Index Sequential Search) 색인 순차 검색(Index Sequential Search) 정렬이 되어 있는 자료 중 일정한 간격으로 떨어져 있는 원소를 가지고 있는 인덱스 테이블(Index Table)을 이용하는 순차 검색이다. 배열의 크기가 n이고 인덱스 테이블의 크기가 m일 때, n/m간격으로 떨어져있는 원소와 인덱스를 인덱스 테이블에 저장한다. 찾을 원소를 인덱스 테이블에서 먼저 검색하여 만족하는 범위를 알아낸 후 그 범위에 대해서만 순차 검색을 수행한다. ​ 인덱스 테이블의 크기가 작으면 인덱스 테이블에 저장하는 간격이 커지므로 배열에서 검색할 범위도 커진다. 반대로 인덱스 테이블의 크기가 커지면 간격이 작아지므로 배열에서 검색할 범위도 작아진다. 하지만 인덱스 테이블을 검색하는 시간이 늘어난다. 시간 복잡도는 O(m+n/m.. 2021. 4. 2.
순차 검색(Sequential Search) 순차 검색(Sequential Search) = 선형 검색(Linear Search) 일렬로 되어 있는 자료를 처음부터 끝까지 순서대로 검색. 자료의 양에 따라 효율이 달라지기 때문에 많은 양의 자료를 대상으로는 비효율적. 알고리즘이 단순하여 구현이 쉽고 가장 간단한 방법이다. ​ 정렬이 되어 있지 않은 순차 자료구조에서의 순차 검색 자료구조의 처음 원소부터 마지막 원소까지 키 값이 일치하는지 비교한다. 일치하는 원소를 찾으면 몇 번째 원소인지 반환하고 찾지 못하면 검색 실패가 된다. 찾고자 하는 원소의 위치에 따라 비교 횟수가 달라지므로 평균 비교 횟수는 (n+1)/2 이고 시간 복잡도는 O(n)이다. ​ 예시 1) 50을 찾는 경우 {57, 16, 41, 2, 50, 6, 32, 27} ===> {5.. 2021. 4. 2.
트리 정렬(Tree Sort) 트리 정렬(Tree Sort) 정렬되지 않은 원소들을 이진 탐색 트리(왼쪽 자식 노드에는 자신보다 작은, 오른쪽 자식 노드에는 자신보다 큰 값인 이진 트리)로 구성한 후 중위 순회 방법(현재 노드의 왼쪽 서브 트리로 이동 -> 현재 노드 -> 현재 노드의 오른쪽 서브 트리로 이동)으로 순회하면서 오름차순으로 정렬한다. ​ 시간 복잡도는 O(nlog2n)이다. ​ 예시) {57, 16, 41, 2, 50, 6, 32, 27} ​ 1. 이진 탐색 트리로 구성 57 / 27 /\ 6 41 /\. /\ 2 16 32 50 2. 중위 순회 방법으로 오름차순 정렬 {2, 6, 16, 27, 32, 41, 50, 57} ​ 프로그램 작성) package test; class TreeNode { int data; Tr.. 2021. 4. 2.
힙 정렬(Heap Sort) 힙 정렬(Heap Sort) 힙 자료구조를 이용하여 정렬. 힙은 완전 이진 트리에 있는 노드 중 키 값이 가장 큰 노드나 가장 작은 노드를 찾기 위해 만들어진 자료구조이다. 키 값이 가장 큰 노드를 찾기 위한 최대 힙(부모 키 >= 자식 키)을 이용해서 내림차순으로 정렬된 원소를 얻을 수 있고, 키 값이 가장 작은 노드를 찾기 위한 최소 힙(부모 키 0; i--) { swap(a, 0, i); // 교환 후 최대힙 재구성 makeHeap(a, i); } } public void makeHeap(int[] a, int num) { for(int i=1; i 0) { int parent = (child-1)/2; if(a[child] > a[parent]) { swap(a, parent, child); } .. 2021. 4. 2.
기수 정렬(Radix Sort) 기수 정렬(Radix Sort) 정렬할 원소의 키 값에 해당하는 버킷(bucket)에 원소를 분배했다가 순서대로 꺼내는 방법으로 정렬. 기수만큼의 버킷이 필요하다. 기수란 즉 '자릿수'이므로 10진수 원소들을 정렬할 때는 0~9 까지의 10개의 버킷을 사용한다. 일의 자리에 대해서 정렬한 후 십의 자리에 대해 정렬 그 다음은 백의 자리에 대해서 정렬하는 방법을 이용한다. ​ 정렬할 원소의 수 n과 키 값의 자릿수 d와 버킷의 수를 결정하는 기수 r에 따라 수행시간이 달라진다. 시간 복잡도는 O(d(n+r))이 된다. ​ 예시) {57, 16, 41, 2, 50, 6, 32, 31} ​ 1. 0~9 까지의 10개의 버킷을 만든다. 버킷 0 ---- [ ] 버킷 1 ---- [ ] 버킷 2 ---- [ ] .. 2021. 4. 2.
병합 정렬(Merge Sort) 병합 정렬(Merge Sort) 정렬된 여러 집합을 결합하여 하나의 정렬된 집합으로 만드는 방법. 전체 원소를 부분집합으로 분할하고 각 부분집합에 대해 정렬 작업을 한 뒤 다시 결합한다. 2개의 정렬된 부분집합을 결합하여 하나의 집합으로 만드는 방법을 2-way 병합 정렬이라 하고 n개의 정렬된 부분집합을 결합하여 하나의 집합으로 만드는 방법을 n-way 병합 정렬이라 한다. ​ 시간 복잡도는 O(nlog2n)이다. ​ 2-way 병합 정렬 예시) {57, 16, 41, 2, 50, 6, 32, 27} ​ 1. 정렬할 집합에 대해서 원소가 하나씩 남을 때까지 분할한다. {57} {16} {41} {2} {50} {6} {32} {27} ​ 2. 부분집합 2개를 정렬하면서 병합한다. 8개의 부분집합이 1개.. 2021. 4. 2.
셸 정렬(Shell Sort) 셸 정렬(Shell Sort) 일정한 간격인 원소들끼리 부분집합으로 묶어 삽입 정렬을 수행하는 작업을 반복하면서 정렬. 삽입 정렬보다 비교, 교환 연산을 줄일 수 있다. 일정한 간격은 매개 변수로 받으며 일반적으로 전체 원소 수의 1/2로 설정하고, 단계를 반복할 때마다 절반으로 감소시키면서 반복한다. ​ 매개변수의 영향으로 인해 성능 분석이 쉽지 않지만 일반적으로 시간 복잡도를 O(n^1.25)로 측정한다. ​ 예시) {57, 16, 41, 2, 50, 6, 32, 27} ​ 1. 일정한 간격을 원소 수의 절반인 4로 설정하고 그에 해당하는 부분집합끼리 삽입 정렬을 수행한다. {57, 16, 41, 2, 50, 6, 32, 27} ===> 57과 50을 삽입 정렬 {50, 16, 41, 2, 57, 6.. 2021. 4. 2.