티스토리 뷰
- 탐색의 개념
- 여러 데이터 중에서 원하는 값을 가진 데이터를 찾는 것
- 데이터 형태 -> 리스트, 트리, 그래프 등
- 내부탐색 vs 외부탐색
- 연산 -> 탐색 + 초기화(정렬), 삽입, 삭제 등
- 순차 탐색
- 리스트 형태로 주어진 원소들에 대해서 처음부터 하나씩 차례대로 비교하면서 원하는 값을 가진 원소를 찾는 방법
- 탐색 실패의 경우 -> 항상 n번 비교 O(n)
- 탐색 성공의 경우 -> 최소 1번 ~ 최대 n번 비교 O(n)
- 삽입 -> O(1)
- 삭제 -> O(n)
- 삭제할 데이터에 대한 탐색이 필요
- 특징
- 모든 리스트에 적용 가능
- 원소가 무순서로 연속해서 저장된 비정렬 데이터 탐색에 적합
- 데이터가 큰 경우에는 부적합
- 탐색과 삭제 -> O(n)
- 모든 리스트에 적용 가능
- 이진 탐색
- 개념과 원리
- 정렬된 배열 형태로 주어진 원소들을 절반씩 줄여가면서 원하는 값을 가진 원소를 찾는 방법
- 분할정복 방법
- 탐색 방법
- 배열의 가운데 원소 A[mid]와 탐색키 x를 비교
- 탐색키 = 가운데 원소 -> 탐색 성공(인덱스 mid 반환 후 종료)
- 탐색키 < 가운데 원소 -> 이진 탐색(원래 크기 1/2인 왼쪽 부분배열) 순환 호출
- 탐색키 > 가운데 원소 -> 이진 탐색(원래 크기 1/2인 오른쪽 부분배열) 순환 호출
- 탐색을 반복할 때마다 대상 원소의 개수가 1/2씩 감소
- T(n) = T(n/2) + O(1) (n>1), T(1) = 1 => T(n) = O(logn)
- 배열의 가운데 원소 A[mid]와 탐색키 x를 비교
- 초기화 알고리즘의 성능: O(nlogn)
- 삽입 알고리즘
- 이진탐색 후 자료가 삽입 될 위치를 찾은 후(O(logn)) 해당 위치에 있는 자료부터 뒤에 있는 자료들을 하나씩 뒤로 이동시킨다(O(n))
- 성능: O(n)
- 삭제 알고리즘
- 이진탐색 후 자료가 삽입 될 위치를 찾은 후(O(logn)) 해당 위치에 있는 자료부터 뒤에 있는 자료들을 하나씩 앞으로 이동시킨다(O(n))
- 성능: O(n)
- 삽입/삭제 연산_ 연결 리스트로 구현한 경우
- 연결 리스트의 경우 인덱스로 접근할 수 없으므로 이진 탐색 자체가 불가능함
- 성능 분석
- 탐색 -> O(logn)
- 초기화 -> O(nlogn)
- 삽입, 삭제 -> O(n)
- 특징
- 정렬된 리스트에 대해서만 적용 가능
- 삽입과 삭제가 빈번한 경우에는 부적합
- 삽입/삭제 후 입력 리스트의 정렬 상태를 유지하기 위해서 O(n)의 자료 이동이 필요
- 정렬된 배열 형태로 주어진 원소들을 절반씩 줄여가면서 원하는 값을 가진 원소를 찾는 방법
- 개념과 원리
- 이진 탐색 트리
- 개념과 원리
- 이진 트리
- 각 노드의 왼쪽 서브트리에 있는 모든 키값은 그 노드의 키값보다 작다.
- 각 노드의 오른쪽 서브트리에 있는 모든 키값은 그 노드의 기값보다 크다.
- 탐색 알고리즘
- 루트 노드로부터 시작해서 크기 관계에 따라 트리의 경로를 따라 내려가면서 탐색을 수행
- 삽입 알고리즘
- 삽입할 원소를 탐색한 후, 탐색이 실패하면 해당 위치에 자식 노드로 추가
- 삭제 연산
- 후속자successor, 계승자 노드
- 어떤 노드의 바로 다음 키값을 갖는 노드
- 삭제되는 노드의 자식 노드의 개수에 따라 구분해서 처리
- 자식 노드가 없는 경우(리프 노드의 경우)
- 남는 노드의 위치 조절이 불필요
- 자식 노드가 하나인 경우
- 자식 노드를 삭제되는 노드의 위치로 올리면서 서브트리 전체도 따라 올린다.
- 자식 노드가 두개인 경우
- 삭제되는 노드의 후속자 노드를 삭제되는 노드의 위치로 올리기
- 후속자 노드를 삭제되는 노드로 취급하여 자식 노드의 개수에 따라 다시 처리
- 자식 노드가 없는 경우(리프 노드의 경우)
- 후속자successor, 계승자 노드
- 성능 분석
- 탐색, 삽입, 삭제의 시간 복잡도
- 키값을 비교하는 횟수에 비례 -> 이진 트리가 높이가 h라면 O(h)
- 모든 노드의 차수가 2인 경우(리프노드 제외): 모든 노드들이 루트노드에 가장 가깝게 붙음
- 평균 수행 시간: O(logn)
- 모든 노드의 차수가 1인 경우(리프노드 제외) = 경사이진트리
- 최악 수행 시간 O(n)
- 탐색, 삽입, 삭제의 시간 복잡도
- 특징
- 삽입/삭제 연산 시 기존 노드의 이동이 거의 발생하지 않음
- 원소의 삽입/삭제에 따라 경사 트리 형태가 될 수 있어 비효율적일 가능성이 있음
- 최악의 수행 시간 O(n)
- 경사 트리가 되지 않도록 균형을 유지해서 O(logn)을 보장 -> 균형 탐색 트리(흑적 트리, B-트리)
- 최악의 수행 시간 O(n)
- 개념과 원리
- 정리
- 탐색의 개념
- 내부탐색, 연산(초기화, 탐색, 삽입, 삭제)
- 종류: 순차 탐색, 이진 탐색, 이진 탐색 트리, 흑적 트리, B-트리, 해싱
- 순차 탐색
- O(n), 모든 리스트에 적용 가능 -> 비정렬 데이터 탐색에 적합
- 이진 탐색
- O(logn), 정렬된 배열에 대해서만 적용 가능 -> 삽입/삭제가 빈번한 응용에는 부적합
- 연결리스트는 이진 탐색 불가능
- 이진 탐색 트리
- 개념, 연산 -> 탐색, 삽입, 삭제(자식 노드의 개수에 따라 구분해서 적용)
- 평균/최선 O(logn), 최악 O(n)
- 탐색의 개념
'algorithm' 카테고리의 다른 글
[algorithm] 합병정렬, 퀵정렬, 힙정렬, 계수, 기수 정렬 (0) | 2021.04.30 |
---|---|
[algorithm] 정렬 알고리즘 (0) | 2021.04.27 |
[algorithm] 그리디 알고리즘 (0) | 2021.04.25 |
[algorithm] 그리디 알고리즘 (0) | 2021.04.17 |
[algorithm] 1952 달팽이 java (0) | 2021.04.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C
- server side rendering
- C++
- 인접행렬
- 클래스
- Stack
- 재귀함수
- 인접리스트
- 알고리즘
- stackframe
- 소프트웨어
- 병행프로세스
- client side rendering
- javascript
- BFS
- 이진탐색
- 구조체
- Java
- 교착상태
- 배열
- 운영체제
- 퀵정렬
- 자료구조
- 최단경로
- 입출력장치
- 스텍
- 동적프로그래밍
- dfs
- 세마포어
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함