Upload
xantha-buck
View
40
Download
2
Embed Size (px)
DESCRIPTION
2.6 탐색 (Search). 1. 순차검색 (Sequential Search, Linear Search) - 첫번째 또는 마지막 레코드를 시작으로 특정 레코드의 탐색 작업이 순차적으로 처리 - 프로그램 작성이 쉽고 , 정렬되지 않은 레코드 검색이 가능 - 파일이 크면 탐색 시간 증가 - 평균비교횟수 : (n+1)/2 평균검색시간 : O(n) 2. 이진검색 (Binary Search) - PowerPoint PPT Presentation
Citation preview
1. 순차검색 (Sequential Search, Linear Search)
- 첫번째 또는 마지막 레코드를 시작으로 특정 레코드의 탐색 작업이 순차적으로 처리
- 프로그램 작성이 쉽고 , 정렬되지 않은 레코드 검색이 가능
- 파일이 크면 탐색 시간 증가
- 평균비교횟수 : (n+1)/2
평균검색시간 : O(n)
2. 이진검색 (Binary Search)
- 상한 값 (F) 과 하한 값 (L) 을 설정하고 그 중간 값 (M) 을 구한 후 키와 중간 값을 계속 비교
하면서 검색 ( 순차적으로 정렬되어 있는 파일에서만 수행 가능 )
- 파일의 탐색 대상을 ½ 씩 줄여가면서 탐색하므로 효율적
- 레코드 수가 많을 수록 효과적 ( 최악의 경우라도 비교횟수는 평균횟수보다 한 번 더 많다 .)
- 평균검색시간 : O(log2n)
2.6 탐색 (Search)
- 이진검색법의 예
key 28 을 찾기 위한 알고리즘
중간 값 M = ( 상한값 F + 하한값 L) / 2
① 중간 값 M
(1+10)/2 = 5.5 ≒ 5
② 중간 값 M
(1+4)/2 = 2.5 ≒ 2
③ 중간 값 M
(3+4)/2 = 3.5 ≒ 3
1
12
2
23
3
28
4
42
5
55
6
61
7
73
8
87
9
95
10
100
key
1 2 3 4 5 6 7 8 9 10
12 23 28 42 55 61 73 87 95 100
key상한값 F 중간값 M 하한값 L
1
12
2
23
3
28
4
42
F M L
3
28
4
42
F,M L
3. 피보나치검색 (Fibonacci Search)
- 피보나치 순열을 이용하여 서브 파일을 형성해 가면서 검색
( 레코드가 반드시 정렬되어 있어야 한다 .)
- 이진검색은 나눗셈을 이용하나 , 피보나치 검색은 덧셈과 뺄셈만으로 검색 가능 ( 속도 빠름 )
- 평균검색시간 : O(log2n)
- 알고리즘
Fk-1 를 인덱스로 하여 인덱스가 가진 값과 K 를 비교
① K < KFk-1 일 경우 : 인덱스 1 부터 Fk-1 –1 까지의 서브 파일을 재귀적으로 탐색
② K=KFk-1 이면 탐색 성공
③ K > KFk-1 일 경우 : 인덱스 Fk-1 +1 부터 Fk-1 -1 까지의 서브파일을 재귀적으로 탐색
재귀적으로 탐색할 인덱스 범위가 결정되면
① 의 경우 다음 탐색될 레코드의 인덱스는 Fk-2 이며
③ 의 경우 탐색될 레코드의 인덱스는 Fk-1 + Fk-3 이 된다 .
- 피보나치 검색의 예 )
피보나치 수는 0,1,1,2,3,5,8,13,21,… 이 되고 , 입력파일은 20 개의 값을 가지므로 Fk = 2
1 ⅰ) Fk-1=13 이므로 인덱스 13 의 값 33 과 비교 . K=15, KFk-1=33 이므로 K < KFk-1
탐색 레코드는 인덱스 1~ 인덱스 12 사이에 위치
ⅱ) Fk-2=8 이므로 인덱스 8 의 값 18 과 비교 . K=15, KFk-2=18 이므로 K < KFk-2
탐색 레코드는 인덱스 1~ 인덱스 7 사이에 위치
ⅲ) Fk-3=5 이므로 인덱스 5 의 값 8 과 비교 . K=15, KFk-3=5 이므로 K > KFk-3
탐색 레코드는 인덱스 6~ 인덱스 7 사이에 위치
ⅳ) Fk-1 + Fk-3 = 5 + 2 = 7 이므로 인덱스 7 의 값 15 와 비교 . K = K(Fk-1+Fk-3)
2
1
3
2
6
3
7
4
8
5
12
6
15
7
18
8
20
9
23
10
24
11
27
12
33
13
41
14
45
15
49
16
55
17
66
18
75
19
89
20
K
인덱스
Fk-1Fk-2Fk-3
4. 보간검색 (Interpolation Search)
- 탐색 대상이 있을 것으로 예상되어지는 위치를 선택하여 탐색
( 레코드가 반드시 정렬되어 있어야 한다 .)
- 사전 , 전화번호 , 색인명 검색
-
- 예 )
ⅰ) (56-20) / (78-20) * 11 = 6.82 ≠ 7
인덱스 7 의 값 60 과 비교 -> 찾는 레코드는 인덱스 1 부터 6 사이에 존재
ⅱ) (56-20) / (56-20) * 6 = 6
인덱스 6 의 값 56 과 비교 -> 탐색 성공
X : 특정 키A(max), A(min) : 키의 최대값과 최소값n : 레코드의 총수
X – A(min)* ni =
A(max) – A(min)
1
20
2
25
3
35
4
43
5
48
6
56
7
60
8
69
9
72
10
75
11
78
5. 블록검색 (Block Search)
- 블록간에는 정렬되어 있어야 하나 , 블록내에는 정렬되어 있을 필요 없음 .
- 인덱스 구성은 블록의 최대 값에 대한 주소로만 구성
- 예 )
ⅰ) 첫번째 인덱스 2 가 갖는 값 9 와 77 비교
ⅱ) 두번째 인덱스 7 이 갖는 값 40 과 77 비교
ⅲ) 세번째 인덱스 11 이 갖는 값 105 와 77 비교 -> 77 은 세번째 블록에 있음
ⅳ) 세번째 블록의 값들을 순차적으로 탐색
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
레코드
인덱스
1 9 5 7 31 27 40 20 99 67 105 77 50 59 55 52
대표인덱스 2 7 11 14
6. 해싱 (Hashing)
- 해싱 함수를 이용하여 레코드가 저장되어 있는 주소를 직접 구하여 검색
( 키를 비교하지 않고 계산에 의해 검색하는 방법 )
- 삽입과 삭제가 빈번한 자료에 적합
- 용어 )
해싱표 (hashing table) : 레코드 위치 저장을 위한 기억공간
테이블은 버켓으로 구성되고 , 버켓은 여러 개의 슬롯으로 구성
버켓 (bucket) : 해싱 주소법에 삽입 가능한 키의 개수
슬롯 (slot) : 한 개의 레코드를 저장할 수 있는 공간
충돌 (collision) : 두개 이상의 레코드가 동일한 버켓 주소를 갖는 경우
동거자 (synonym) : 동일한 버켓 주소를 갖는 서로 다른 레코드의 집합
- 오버플로우 처리방법
개방주소지정 (open addressing)
충돌발생시 해싱테이블에 비어 있는 다른 버켓을 찾아 주소 저장 ( 주소 재계산 )
체인 (chain) 기법 : 포인터를 이용하여 비어 있는 버켓을 지정
폐쇄주소지정 (close addressing)
오버플로우 발생시 링크로 연결하여 해결
◆ 다시 한 번 1. 순차검색 (Linear Search, Sequential Search)
- 기억장소의 처음부터 차례대로 탐색하는 방법이다 .
- 가장 간단하나 속도가 느리다 .
- 자료가 정렬되어 있을 필요가 없다 .
2. 이진검색 (Binary Search)
- 처음값과 마지막값에 대한 중간값을 계산한 후 키 값과 비교하여 검색한다 .
- 이미 자료가 정렬되어 있어야 한다 .
- 자료가 많을 수록 효과적이다 .
3. 피보나치검색 (Fibonacci Search)
- 피보나치 순열을 이용해서 탐색한다 .
- 자료가 정렬되어 있어야 한다 .
- 덧셈과 뺄셈만으로 탐색이 가능하다 .
- 알고리즘 구현이 복잡하고 , 초기에 피보나치 수열화되어 있어야 한다 .
4. 보간검색 (Interpolation Search)
- 자료가 있을만한 위치의 키를 선택하여 탐색한다 . ( 자료가 정렬되어 있어야 한다 .)
- 파일이나 키의 분포 상황에 따라 영향을 받는다 .
- 곱하기와 나누기 연산을 많이 하므로 자주 사용하지 않는다 .
5. 블록검색 (Block Search)
- 파일을 몇 개의 블록으로 나누어 찾는 레코드가 어느 블록에 있는가 찾는 방법이다 .
- 어느 블록에 있는지 판단되었으면 그 블록내에서 선형검색한다 .
- 자료가 어느 정도 정렬되어 있을 경우 효과적이 방법이다 .
기출 . 예상 문제
1. 다음 탐색 (Search) 방법 중 가장 빠른 것은 ?
① Binary Search Tree ② Sequential Search
③ Block Search ④ Linear Search
2. 블록 탐색은 어느 경우에 특히 유용한가 ?
① 자료가 네 가지 범주에 정리되어 있지 않을 때
② 출력량이 많을 때
③ 알파벳 코드를 사용할 때
④ 자료가 거의 올바른 순서로 정리되어 있을 때
3. 이진탐색 (Binary Search) 의 특징이 아닌것은 ?
① 작은 리스트에 적합하다 . ② 전체 레코드를 찾는 시간은 증가한다 .
③ 원하는 레코드를 신속히 찾을 수 있다 . ④ 약간의 계산이 필요하다 .
기출 . 예상 문제
4. 정렬되어 있지 않은 자료를 탐색하기 위하여 가장 효과적인 방법은 ?
① 순차탐색 (Sequential Search) ② 2 진탐색 (Binary Search)
③ 확률탐색 (Probabilistic Search) ④ 피보나치탐색 (Fibonacci Search)
5. 정렬되어 있는 N개의 요소를 가진 파일에서 하나의 요소에서 순차적 탐색을 할 때 평균 search
길이는 ?
① {N(N+1)} / 2 ② (N+1) / 2
③ (N+1) /2N ④ (2N+1) /2
6. 해싱 (Hashing) 기법에 대한 설명으로 옳은 것은 ?
① 버킷 (bucket) 이란 한 개의 레코드를 저장할 수 있는 공간으로 N개의 버킷이 모여 슬롯을
이룬다 .
② 충돌 (collision) 이란 두개 이상의 레코드가 동일한 버켓 주소를 갖는 경우를 말한다 .
③ 동거자 (synonym)란 서로 다른 버켓 주소를 갖는 레코드의 집합 .
④ 개방주소법 (open addressing) 이란 오버플로 발생시 이를 별도의 기억공간에 두고 링크로
연결하여 사용하는 방법을 말한다 .