101
IT CookBook, C 로 로로로 로로 로로로로 ( 로로로 ) 검검 / 검검 (Search)

검색 / 탐색 (Search)

  • Upload
    rigg

  • View
    253

  • Download
    5

Embed Size (px)

DESCRIPTION

11. 검색 / 탐색 (Search). 학습목표 자료에 대한 검색의 개념을 이해한다 . 순차 검색의 개념과 알고리즘을 알아본다 . 이진 검색의 개념과 알고리즘을 알아본다 . 해싱에 대해 알아보고 다른 검색 알고리즘과의 차이를 이해한다 . 내용 검색 순차 검색 이진 검색 이진 트리 검색 해싱. 1. 검색 / 탐색. 검색 / 탐색 (search) 컴퓨터에 저장한 자료 중에서 원하는 항목을 찾는 작업 검색 성공 - 원하는 항목을 찾은 경우 검색 실패 – 원하는 항목을 찾지 못한 경우 - PowerPoint PPT Presentation

Citation preview

Page 1: 검색 / 탐색 (Search)

IT CookBook, C 로 배우는 쉬운 자료구조 ( 개정판 )

검색 /탐색 (Search)

Page 2: 검색 / 탐색 (Search)

2/50

Contents

학습목표 자료에 대한 검색의 개념을 이해한다 . 순차 검색의 개념과 알고리즘을 알아본다 . 이진 검색의 개념과 알고리즘을 알아본다 . 해싱에 대해 알아보고 다른 검색 알고리즘과의 차이를 이해한다 .

내용 검색 순차 검색 이진 검색 이진 트리 검색 해싱

Page 3: 검색 / 탐색 (Search)

3/50

검색 /탐색 (search) 컴퓨터에 저장한 자료 중에서 원하는 항목을 찾는 작업

• 검색 성공 - 원하는 항목을 찾은 경우

• 검색 실패 – 원하는 항목을 찾지 못한 경우

탐색 키를 가진 항목을 찾는 것• 탐색 키 (search key) - 자료를 구별하여 인식할 수 있는 키

삽입 /삭제 작업에서의 검색• 원소를 삽입하거나 삭제할 위치를 찾기 위해서 검색 연산 수행

1. 검색 /탐색

Page 4: 검색 / 탐색 (Search)

4/50

검색 방법 수행 위치에 따른 분류

• 내부 검색 - 메모리 내의 자료에 대해서 검색 수행 • 외부 검색 - 보조 기억 장치에 있는 자료에 대해서 검색 수행

검색 방식에 따른 분류• 비교 검색 방식 (comparison search method)

− 검색 대상의 키를 비교하여 검색하는 방법

− 순차 검색 , 이진 검색 , 트리 검색• 계산 검색 방식 (non-comparison method)

− 계수적인 성질을 이용한 계산으로 검색 하는 방법

− 해싱

검색 방법의 선택• 자료 구조의 형태와 자료의 배열 상태에 따라 최적의 검색 방법 선택

1. 검색

Page 5: 검색 / 탐색 (Search)

5/50

순차 검색 (sequential search, 선형 검색 (linear search)) 일렬로 된 자료를 처음부터 마지막까지 순서대로 검색하는 방법 가장 간단하고 직접적인 검색 방법 배열이나 연결 리스트로 구현된 순차 자료 구조에서 원하는 항목을

찾는 방법 검색 대상 자료가 많은 경우에 비효율적이지만 알고리즘이 단순하여

구현이 용이함

2. 순차 검색

Page 6: 검색 / 탐색 (Search)

6/50

순차 검색 – 정렬되지 않은 순차자료구조에서의 순차 검색 검색 방법

• 첫 번째 원소부터 시작하여 마지막 원소까지 순서대로 키 값이 일치하는 원소가 있는지를 비교하여 찾는다 . − 키 값이 일치하는 원소를 찾으면 그 원소가 몇 번째 원소인지를 반환

− 마지막 원소까지 비교하여 키 값이 일치하는 원소가 없으면 찾은 원소가 없는 것이므로 검색 실패

순차 검색 예 ) 검색 성공의 경우

2. 순차 검색

Page 7: 검색 / 탐색 (Search)

7/50

순차 검색 예 ) 검색 실패의 경우

2. 순차 검색

Page 8: 검색 / 탐색 (Search)

8/50

정렬되어있지 않은 자료에 대한 순차검색 알고리즘

• 비교횟수 - 찾고자 하는 원소의 위치에 따라 결정− 찾는 원소가 첫 번째 원소라면 비교횟수는 1 번 , 두 번째 원소라면 비교횟수는 2

번 , 세 번째 원소라면 비교횟수는 3 번 , 찾는 원소가 i 번째 원소이면 i 번 , …− 정렬되지 않은 원소에서의 순차 검색의 평균 비교 횟수 = 1/n(1+2+3+ … + n) = (n+1)/2  

• 평균 시간 복잡도 : O(n)O(n)

2. 순차 검색

Page 9: 검색 / 탐색 (Search)

9/50

정렬되어있지 않은 자료에 대한 순차검색 C 프로그램• 검색 대상 자료 : {8, 30, 1, 9, 11, 19, 2} - 7 개• 검색 1 : 탐색키 9 검색 ☞ 검색 성공 !• 검색 2 : 탐색키 6 검색 ☞ 검색 실패 !• 실행 결과 >

2. 순차 검색 : [ 예제 11-1]

Page 10: 검색 / 탐색 (Search)

10/50

2. 순차 검색 : [ 예제 11-1]

01 #include <stdio.h>0203 void sequentialSearch1(int a[], int n, int key)04 {05 int i=0;06 printf("\n %d 를 검색하여라 ! ->> ", key);07 while (i<n && a[i]!=key) i++;08 if(i<n) printf("%d 번째에 검색 성공 ! \n\n", i+1);09 else printf("%d 번째에 검색 실패 ! \n\n", i+1);10 }1112 void main()13 {14 int a[]={8, 30, 1, 9, 11, 19, 2};15 int n=7;1617 sequentialSearch1(a, n, 9);18 sequentialSearch1(a, n, 6);1920 getchar();21 }

Page 11: 검색 / 탐색 (Search)

11/50

순차 검색 – 정렬되어 있는 순차자료구조에서의 순차 검색 검색 방법

• 순서대로 검색하면서 키 값을 비교하여 , 원소의 키 값이 찾는 키 값보다 크면 찾는 원소가 없는 것이므로 더 이상 검색을 수행하지 않고 검색종료

• 정렬되어있는 자료에 대한 순차 검색 예 )

2. 순차 검색

Page 12: 검색 / 탐색 (Search)

12/50

정렬되어있는 자료에 대한 순차검색 알고리즘

• 비교횟수 - 찾고자 하는 원소의 위치에 따라 결정− 검색 실패의 경우에 평균 비교 횟수가 반으로 줄어든다 .− 정렬되어있는 원소에서의 순차 검색의 평균 비교 횟수 = 1/n(1+2+3+ … + n) x 1/2 = (n+1)/4  

• 평균 시간 복잡도 : O(n)O(n)

2. 순차 검색

Page 13: 검색 / 탐색 (Search)

13/50

정렬되어있는 자료에 대한 순차검색 C 프로그램• 검색 대상 자료 : {1, 2, 8, 9, 11, 19, 29} – 7 개• 검색 1 : 탐색키 9 검색 ☞ 검색 성공 !• 검색 2 : 탐색키 6 검색 ☞ 검색 실패 !• 실행 결과 >

2. 순차 검색 : [ 예제 11-2]

Page 14: 검색 / 탐색 (Search)

14/50

2. 순차 검색 : [ 예제 11-2]

01 #include <stdio.h>0203 void sequentialSearch2(int a[], int n, int key)04 {05 int i=0;06 printf("\n %d 를 검색하여라 ! ->> ", key);07 while (a[i] < key) i++;08 if(a[i]==key) printf("%d 번째에 검색 성공 !\n\n", i+1);09 else printf("%d 번째에 검색 실패 ! \n\n", i+1);10 }1112 void main()13 {14 int a[]={1, 2, 8, 9, 11, 19, 29};15 int n=7;1617 sequentialSearch2(a, n, 9);18 sequentialSearch2(a, n, 6);1920 getchar();21 }

Page 15: 검색 / 탐색 (Search)

15/50

색인 순차 검색 (index sequential search) 정렬되어있는 자료에 대한 인덱스 테이블 (index table) 을 추가로

사용하여 탐색 효율을 높인 검색 방법 인덱스 테이블

• 배열에 정렬되어있는 자료 중에서 일정한 간격으로 떨어져있는 원소들을 저장한 테이블

− 자료가 저장되어있는 배열의 크기가 n 이고 인덱스 테이블의 크기가 m 일 때 ,

배열에서 n/m 간격으로 떨어져있는 원소와 그의 인덱스를 인덱스 테이블에 저장

검색 방법• indexTable[i].key ≤ key < indexTable[i+1].key 를 만족하는 i

를 찾아서 배열의 어느 범위에 있는지를 먼저 알아낸 후에 해당 범위에 대해서만 순차 검색 수행

2. 순차 검색

Page 16: 검색 / 탐색 (Search)

16/50

색인 순차 검색 예• 검색 대상 자료 : {1, 2, 8, 9, 11, 19, 29} • 크기가 3 인 인덱스 테이블 작성• 인덱스 테이블에서 먼저 탐색키를 검색하여 검색 범위를 확인하고 ,

해당 범위에 대해서만 순차 검색 실행

2. 순차 검색

Page 17: 검색 / 탐색 (Search)

17/50

색인 순차 검색 C 프로그램• 검색 대상 자료 : {1, 2, 8, 9, 11, 19, 29} – 7 개• 인덱스 테이블 크기 : 3• 검색 1 : 탐색키 9 검색 ☞ 검색 성공 !• 검색 2 : 탐색키 6 검색 ☞ 검색 실패 !• 실행 결과 >

2. 순차 검색 : [ 예제 11-3]

Page 18: 검색 / 탐색 (Search)

18/50

2. 순차 검색 : [ 예제 11-3]

01 #include <stdio.h>0203 #define INDEX_SIZE 30405 typedef struct{06 int index;07 int key;08 } itable;09 itable indexTable[INDEX_SIZE];1011 void sequentialSearch2(int a[], int begin, int end, int key)12 {13 int i=begin;1415 printf("\n %d 를 검색하여라 ! ->> ", key);16 while(i<end && a[i]<key) i++;1718 if(a[i]==key) printf("%d 번째에 검색 성공 !\n\n", (i-begin)+1);19 else printf("%d 번째에 검색 실패 ! \n\n", (i-begin)+1);20 }21

Page 19: 검색 / 탐색 (Search)

19/50

2. 순차 검색 : [ 예제 11-3]

22 void makeIndexTable(int a[], int size)23 {24 int i, n;25 n=size/INDEX_SIZE;26 if(size%INDEX_SIZE > 0) n=n+1;27 for(i=0; i<INDEX_SIZE; i++){28 indexTable[i].index = i*n;29 indexTable[i].key = a[i*n];30 }31 }3233 void indexSearch(int a[], int n, int key)34 {35 int i, begin, end;36 if (key < a[0] || key > a[n-1])37 printf("\n 찾는 키가 없습니다 . 검색 실패 ! \n");38 for (i=0; i<INDEX_SIZE; i++)39 if ((indexTable[i].key <= key) && (indexTable[i+1].key > key)){40 begin = indexTable[i].index;41 end = indexTable[i+1].index;42 break;43 }

Page 20: 검색 / 탐색 (Search)

20/50

2. 순차 검색 : [ 예제 11-3]

44 if (i == INDEX_SIZE) {45 begin = indexTable[i-1].index;46 end = n;47 }4849 sequentialSearch2(a, begin, end, key);50 }5152 void main()53 {54 int a[]={1, 2, 8, 9, 11, 19, 29};55 int n=7;56 printf("\n\t<< 색인 순차 검색 >>\n");57 makeIndexTable(a, n);58 indexSearch(a, n, 9);59 indexSearch(a, n, 6);6061 getchar();60 }

Page 21: 검색 / 탐색 (Search)

21/50

색인 순차 검색의 성능• 인덱스 테이블의 크기에 따라 결정

− 인덱스 테이블의 크기가 줄어들면 배열의 인덱스를 저장하는 간격이 커지므로 배열에서 검색해야하는 범위도 커진다 .

− 인덱스 테이블의 크기를 늘리면 배열의 인덱스를 저장하는 간격이 작아지므로 배열에서 검색해야하는 범위는 작아지겠지만 인덱스 테이블을 검색하는 시간이 늘어나게 된다 .

• 색인 순차 검색의 시간 복잡도 : O(m + n/m)O(m + n/m)

− 배열의 크기 : n, 인덱스 테이블의 크기 : m

2. 순차 검색

Page 22: 검색 / 탐색 (Search)

22/50

이진 검색 (binary search, 이분 검색 , 보간 검색(interpolation search)) 자료의 가운데에 있는 항목을 키 값과 비교하여 다음 검색 위치를

결정하여 검색을 계속하는 방법• 찾는 키 값 > 원소의 키 값 : 오른쪽 부분에 대해서 검색 실행• 찾는 키 값 < 원소의 키 값 : 왼쪽 부분에 대해서 검색 실행

키를 찾을 때까지 이진 검색을 순환적으로 반복 수행함으로써 검색 범위를 반으로 줄여가면서 더 빠르게 검색

정복 기법을 이용한 검색 방법• 검색 범위를 반으로 분할하는 작업과 검색 작업을 반복 수행

정렬되어있는 자료에 대해서 수행하는 검색 방법

3. 이진 검색

Page 23: 검색 / 탐색 (Search)

23/50

이진 검색의 예

3. 이진 검색

Page 24: 검색 / 탐색 (Search)

24/50

이진 검색 알고리즘

삽입이나 삭제가 발생했을 경우에 항상 배열의 상태를 정렬 상태로 유지하는 추가적인 작업 필요

시간 복잡도 : O(logO(log22nn))

3. 이진 검색

Page 25: 검색 / 탐색 (Search)

25/50

이진 트리 검색 (binary tree search) 8 장에서 설명한 이진 탐색 트리를 사용한 검색 방법 원소의 삽입이나 삭제 연산에 대해서 항상 이진 탐색 트리를

재구성하는 작업 필요

4. 이진 트리 검색

Page 26: 검색 / 탐색 (Search)

26/50

이진 트리 검색을 이용한 영어사전 검색 프로그램 영어 단어와 뜻을 입력하면 알파벳순서대로 이진 탐색 트리에 삽입 검색할 단어를 입력하면 이진 트리 검색으로 검색하여 단어의 뜻을

출력 사전 출력을 선택하면 트리를 중위 순회하면서 트리에 있는 모든

단어를 출력

4. 이진 트리 검색 : [ 예제 11-4] 영어사전 검색 프로그램

Page 27: 검색 / 탐색 (Search)

27/50

실행 결과 > (1)

4. 이진 트리 검색 : [ 예제 11-4] 영어사전 검색 프로그램

Page 28: 검색 / 탐색 (Search)

28/50

실행 결과 > (2)

4. 이진 트리 검색 : [ 예제 11-4] 영어사전 검색 프로그램

Page 29: 검색 / 탐색 (Search)

29/50

실행 결과 > (3)

4. 이진 트리 검색 : [ 예제 11-4] 영어사전 검색 프로그램

Page 30: 검색 / 탐색 (Search)

30/50

실행 결과 > (4)

4. 이진 트리 검색 : [ 예제 11-4] 영어사전 검색 프로그램

Page 31: 검색 / 탐색 (Search)

31/50 알고리즘 분석 31

% 균형 트리 (Balanced Tree)

이진 트리 알고리즘최악의 경우 성능이 나쁨 : 정렬된 화일 또는 역순으로

정렬된 화일 , 큰 키와 작은 키가 교대로 나오는 파일성능 개선

퀵 정렬의 경우 성능 개선 방법은 확률에 의해 임의의 분할 원소를 선택하는 수 밖에 없음

이진 트리 탐색의 경우에는 트리를 균형 있게 유지하면 최악의 상황을 피할 수 있음

일반적인 개념은 쉽게 기술할 수 있지만 , 실제 구현에서는 특수한 상황을 고려해야 함

Page 32: 검색 / 탐색 (Search)

32/50 알고리즘 분석 32

% 2-3-4 트리 (2-3-4 Tree)

이진 탐색 트리 (1 개의 키 , 2 개의 링크 ) 에서 발생하는 최악의 상황을 방지하기 위해 다음과 같이 자료구조를 변경 트리에 있는 하나의 노드가 하나 이상의 키를 가질 수 있음 3- 노드 (2 개의 키 , 3 개의 링크 ) 와 4- 노드 (3 개의 키 , 4 개의 링크 )

를 허용 트리의 균형에 대해 신경 쓰지 않아도 완벽한 균형 트리가 만들어 짐

Page 33: 검색 / 탐색 (Search)

33/50 알고리즘 분석 33

% 분할 과정 (1)

루트가 4- 노드인 경우 세 개의 2- 노드로 변환루트의 분할은 트리의 높이를 하나 증가시킴

부모가 2- 노드인 4- 노드의 경우 중간 키를 부모로 보내여 3- 노드에 연결된 두 개의 2- 노드로 변환

부모가 3- 노드인 4- 노드의 경우 4- 노드에 연결된 두 개의 2- 노드로 변환

Page 34: 검색 / 탐색 (Search)

34/50 알고리즘 분석 34

% 분할 과정 (2)

4- 노드가 2-3-4 트리의 루트인 경우 노드가 루트인 경우의 분할 (Ti 는 서브트리 )

루트 :

T1 T2 T3 T4

5

T1 T2 T3 T4

4 5 6

4 6

Page 35: 검색 / 탐색 (Search)

35/50 알고리즘 분석 35

% 분할 과정 (3)

4- 노드가 2- 노드의 자식인 경우의 분할 4- 노드가 2- 노드의 왼쪽 자식인 경우

4- 노드가 2- 노드의 왼쪽 중간 자식인 경우

T1

T2 T3 T4

4

T1

T2 T3 T4

4

T5

6

T5

5 6 7 5 7

T1 T2 T3 T4

57

T5

7

T5

4 5 6

T1 T2 T3 T4

4 6

Page 36: 검색 / 탐색 (Search)

36/50 알고리즘 분석 36

% 분할 과정 (4)

 4- 노드가 3- 노드의 자식인 경우 4- 노드가 3- 노드의 왼쪽 자식인 경우

4- 노드가 3- 노드의 왼쪽 중간 자식인 경우

57

T5

7

T5

8

T6

8

T6

T1 T2 T3 T4

4 5 6

T1 T2 T3 T4

4 6

T1

4

T1

4 68

T6

8

T6

T2 T3 T4 T5

5 6 7

T2 T3 T4 T5

5 7

Page 37: 검색 / 탐색 (Search)

37/50 알고리즘 분석 37

% 분할 과정 (5)

4- 노드가 3- 노드의 오른쪽 자식인 경우

T1 T2

T3 T4

4

T5

5

T6

7

T1 T2

T3 T4

4 5

T5 T6

6 7 8 6 8

Page 38: 검색 / 탐색 (Search)

38/50 알고리즘 분석 38

% 2-3-4 트리의 구축 과정 (1)

키 삽입 ( 2, 1, 8, 9, 7, 3, 6, 4, 5 )

Page 39: 검색 / 탐색 (Search)

39/50 알고리즘 분석 39

% 2-3-4 트리의 구축 과정 (2)

키 삽입 ( 2, 1, 8, 9, 7, 3, 6, 4, 5 )

Page 40: 검색 / 탐색 (Search)

40/50 알고리즘 분석 40

% 성능 특성

N- 노드로 이루어진 2-3-4 트리의 탐색은 logN + 1 개 이상 노드를 방문하지 않음

N- 노드로 이루어진 2-3-4 트리의 삽입은 최악의 경우 logN + 1 개의 노드를 분할하며 , 평균적으로는 하나 이하의 노드를 분할함2-3-4 트리에서 4- 노드의 개수가 적음

일반적으로 높이가 h 인 2-3-4 트리는 2h+1-1 과 4h+1-1 사이의 키를 포함

N 개의 키를 포함하는 2-3-4 트리의 높이는 ⌈ log4(N+1)⌉-1 과 ⌈ log2(N+1)⌉-1 사이

Page 41: 검색 / 탐색 (Search)

41/50 알고리즘 분석 41

% 레드 - 블랙 트리 (red-black tree)

2-3-4 트리를 표준 이진 트리로 표현하는 방법노드당 추가로 1 비트가 더 필요함블랙 링크는 보통의 노드이고 , 3- 노드와 4-

노드는 레드 링크로 연결된 이진 트리로 표현

or

Page 42: 검색 / 탐색 (Search)

42/50 알고리즘 분석 42

% 성질

루트나 외부 노드는 모두 블랙 루트에서 외부 노드까지의 경로 상에는 2 개의 연속된 레드

노드가 포함되지 않음루트에서 각 외부 노드까지의 경로에 있는 블랙 노드의 수는

모두 같음동일한 키를 가지는 레코드는 노드의 왼쪽과 오른쪽에 모두 올 수 있음

동일한 키가 여러 개 있을 때 주어진 키를 갖는 모든 노드를 찾는 것이 어려움

Page 43: 검색 / 탐색 (Search)

43/50 알고리즘 분석 43

% 4- 노드의 분할

Page 44: 검색 / 탐색 (Search)

44/50 알고리즘 분석 44

% 4- 노드의 분할 ( 회전 필요 )

단일회전

이중회전

Page 45: 검색 / 탐색 (Search)

45/50 알고리즘 분석 45

% 단일 회전

x

p

g

T1 T2

T3

T4 x

p

g

T1 T2 T3 T4

x

p

g

T1

T2

T3 T4

g

p

x

T1 T2 T3 T4

Page 46: 검색 / 탐색 (Search)

46/50 알고리즘 분석 46

% 이중 회전

x

p

g

T1

T2 T3

T4

x

p

g

T1 T2

T3

T4 p

x

g

T1 T2 T3 T4

p

x

g

T1

T2

T3 T4

g

x

p

T1 T2 T3 T4

x

p

g

T1

T2 T3

T4

Page 47: 검색 / 탐색 (Search)

47/50 알고리즘 분석 47

% 레드 블랙 트리의 구축과정 (1)

키 ( 2, 1, 8, 9, 7, 3, 6, 4, 5 )

2 삽입 1 삽입 8 삽입

9 삽입 7 삽입

Page 48: 검색 / 탐색 (Search)

48/50 알고리즘 분석 48

% 레드 블랙 트리의 구축과정 (2)

키 ( 2, 1, 8, 9, 7, 3, 6, 4, 5 )

3 삽입 6 삽입

이중 회전 4 삽입

Page 49: 검색 / 탐색 (Search)

49/50 알고리즘 분석 49

% 레드 블랙 트리의 구축과정 (3)

키 ( 2, 1, 8, 9, 7, 3, 6, 4, 5 )

이중 회전 5 삽입

단일 회전

Page 50: 검색 / 탐색 (Search)

50/50 알고리즘 분석 50

% 회전 (rotate)

struct node *rotate(int v, struct node *y){ struct node *gc, *c;

c = (y->key > v) ? y->l : y->r; if (c->key > v) { gc = c->l; c->l = gc->r; gc->r = c; } else {

gc = c->r; c->r = gc->l; gc->l = c; } if (y->key > v) y->l = gc; else y->r = gc; return gc;}

Page 51: 검색 / 탐색 (Search)

51/50 알고리즘 분석 51

% 분할 (split)

void split(int v){ x->b = red; x->l->b = black; x->r->b = black; if (p->b) { g->b = red; if (g->key > v != p->key > v) p = rotate(v, g); x = rotate(v, gg); x->b = black; }}

Page 52: 검색 / 탐색 (Search)

52/50 알고리즘 분석 52

% 성능 특성

r 을 서열 (rank) 이라 할 때 , 노드 수 ( 키 값의 수 ) N 은 N ≥ 2r-1

레드 - 블랙 트리의 높이 h 는 h ≤ 2log(N+1) 이므로 , 삽입 시간 복잡도는 Ο(logN)

레드 - 블랙 트리는 이진 탐색 트리이기 때문에 탐색은 일반 이진 탐색 트리의 탐색 연산으로 수행할 수 있으므로 레드 - 블랙 트리의 탐색 시간 복잡도는 Ο(logN)

Page 53: 검색 / 탐색 (Search)

53/50

해싱 (hashing) 산술적인 연산을 이용하여 키가 있는 위치를 계산하여 바로 찾아가는

계산 검색 방식 검색 방법

• 키 값에 대해서 해싱 함수를 계산하여 주소를 구하고 , • 구한 주소에 해당하는 해시 테이블로 바로 이동

− 해당 주소에 찾는 항목이 있으면 검색 성공 , 없으면 검색 실패

해싱 함수 (hashing function)• 키 값을 원소의 위치로 변환하는 함수

해시 테이블 (hash table)• 해싱 함수에 의해서 계산된 주소의 위치에 항목을 저장한 표

5. 해싱

Page 54: 검색 / 탐색 (Search)

54/50

해싱 검색 수행 방법

5. 해싱

Page 55: 검색 / 탐색 (Search)

55/50

해싱의 예• 도서관에서의 도서 검색

5. 해싱

Page 56: 검색 / 탐색 (Search)

56/50

해싱의 예•강의실 좌석 배정

5. 해싱

Page 57: 검색 / 탐색 (Search)

57/50

해싱 용어 정리•충돌 (collision)

− 서로 다른 키 값에 대해서 해싱 함수에 의해 주어진 버킷 주소를 같은 경우− 충돌이 발생한 경우에 비어있는 슬롯에 동거자 관계로 키 값 저장

•동거자 (synonym) − 서로 다른 키 값을 가지지만 해싱 함수에 의해서 같은 버킷에 저장된 키 값들

• 오버플로우 − 버킷에 비어있는 슬롯이 없는 포화 버킷 상태에서 충돌이 발생하여 해당 버킷에 키

값을 저장할 수 없는 상태

5. 해싱

Page 58: 검색 / 탐색 (Search)

58/50

• 키 값 밀도

− 사용 가능한 전체 키 값들 중에서 현재 해시 테이블에 저장되어서 실제 사용되고 있는 키 값의 개수 정도

• 적재 밀도

− 해시 테이블에 저장 가능한 키 값의 개수 중에서 현재 해시 테이블에 저장되어서 실제 사용되고 있는 키 값의 개수 정도

5. 해싱

Page 59: 검색 / 탐색 (Search)

59/50

해싱 함수 해싱 함수의 조건

• 해싱 함수는 계산이 쉬워야 한다 .

− 비교 검색 방법을 사용하여 키 값의 비교연산을 수행하는 시간보다 해싱 함수를 사용하여 계산하는 시간이 빨라야 해싱 검색을 사용하는 의미가 된다 .

• 해싱 함수는 충돌이 적어야 한다 .

− 충돌이 많이 발생한다는 것은 같은 버킷을 할당 받는 키 값이 많다는 것이므로 비어있는 버킷이 많은데도 어떤 버킷은 오버플로우가 발생할 수 있는 상태가 되므로 좋은 해싱 함수가 될 수 없다 .

• 해시 테이블에 고르게 분포할 수 있도록 주소를 만들어야 한다 .

5. 해싱

Page 60: 검색 / 탐색 (Search)

60/50

해싱 함수의 종류 중간 제곱 함수

• 키 값을 제곱한 결과 값에서 중간에 있는 적당한 비트를 주소로 사용하는 방법

• 제곱한 값의 중간 비트들은 대개 키의 모든 값과 관련이 있기 때문에 서로 다른 키 값은 서로 다른 중간 제곱 함수 값을 갖게 된다 .

• 예 ) 키 값 00110101 10100111 에 대한 해시 주소 구하기

                       00110101 10100111          X             00110101 10100111

         0000101100111110100111101001001011110001

5. 해싱

해시 주소

Page 61: 검색 / 탐색 (Search)

61/50

제산 함수 • 함수는 나머지 연산자 mod(C 에서의 % 연산자 ) 를 사용하는 방법• 키 값 k 를 해시 테이블의 크기 M으로 나눈 나머지를 해시 주소로 사용 • 제산함수 : h(k) = k mod M

•M으로 나눈 나머지 값은 0~(M-1) 이 되므로 해시 테이블의 인덱스로 사용• 해시 주소는 충돌이 발생하지 않고 고르게 분포하도록 생성되어야 하므로

키 값을 나누는 해시 테이블의 크기 M은 적당한 크기의 소수 (prime number) 사용

승산 함수 •곱하기 연산을 사용하는 방법• 키 값 k 와 정해진 실수 α를 곱한 결과에서 소수점 이하 부분만을 테이블의

크기 M과 곱하여 그 정수 값을 주소로 사용

5. 해싱

Page 62: 검색 / 탐색 (Search)

62/50

접지 함수 • 키의 비트 수가 해시 테이블 인덱스의 비트 수보다 큰 경우에 주로 사용• 이동 접지 함수

− 각 분할 부분을 이동시켜서 오른쪽 끝자리가 일치하도록 맞추고 더하는 방법− 예 ) 해시 테이블 인덱스가 3 자리이고 키 값 k 가 12312312312 인 경우

5. 해싱

Page 63: 검색 / 탐색 (Search)

63/50

• 경계 접지 함수 − 분할된 각 경계를 기준으로 접으면서 서로 마주보도록 배치하고 더하는 방법− 예 ) 해시 테이블 인덱스가 3 자리이고 키 값 k 가 12312312312 인 경우

5. 해싱

Page 64: 검색 / 탐색 (Search)

64/50

숫자 분석 함수 • 키 값을 이루고 있는 각 자릿수의 분포를 분석하여 해시 주소로 사용하는

방법•각 키 값을 적절히 선택한 진수로 변환한 후에 각 자릿수의 분포를 분석하여

가장 편중된 분산을 가진 자릿수는 생략하고 , 가장 고르게 분포된 자릿수부터 해시 테이블 주소의 자릿수만큼 차례로 뽑아서 만든 수를 역순으로 바꾸어서 주소로 사용

• 예 ) 키 값이 학번이고 해시 테이블 주소의 자릿수가 3 자리인 경우

5. 해싱

Page 65: 검색 / 탐색 (Search)

65/50

진법 변환 함수 • 키 값이 10 진수가 아닌 다른 진수일 때 , 10 진수로 변환하고 해시 테이블 주소로 필요한 자릿수만큼만 하위자리의 수를 사용하는 방법

비트 추출 함수 • 해시 테이블의 크기가 2k 일 때 키 값을 이진 비트로 놓고 임의의 위치에

있는 비트들을 추출하여 주소로 사용하는 방법• 이 방법에서는 충돌이 발생할 가능성이 많으므로 테이블의 일부에 주소가 편중되지 않도록 키 값들의 비트들을 미리 분석하여 사용해야 한다 .

5. 해싱

Page 66: 검색 / 탐색 (Search)

66/50

오버플로우 처리 방법 선형 개방 주소법 ( 선형 조사법 (linear probing))

• 해싱 함수로 구한 버킷에 빈 슬롯이 없어서 오버플로우가 발생하면 , 그 다음 버킷에 빈 슬롯이 있는지 조사한다 .

− 빈 슬롯이 있으면 - 키 값을 저장

− 빈 슬롯이 없으면 - 다시 그 다음 버킷을 조사

− 이런 과정을 되풀이 하면서 해시 테이블 내에 비어있는 슬롯을 순차적으로 찾아서 사용하여 오버플로우 문제를 처리하는 방법

5. 해싱

Page 67: 검색 / 탐색 (Search)

67/50

선형 개방 주소법을 이용한 오버플로우 처리 예• 해시 테이블의 크기 : 5

• 해시 함수 : 제산함수 사용 . 해시 함수 h(k) = k mod 5

• 저장할 키 값 : {45, 9, 10, 96, 25}

①키 값 45 저장 : h(45) = 45 mod 5 = 0 ⇒ 해시 테이블 0번에 45 저장

②키 값 9 저장 : h(9) = 9 mod 5 = 4 ⇒ 해시 테이블 4번에 9 저장

③키 값 10 저장 : h(10) = 10 mod 5 = 0 ⇒ 충돌 발생 !

⇒ 다음 버킷 중에서 비어있는 버킷 1 에 10 저장

④키 값 96 저장 : h(96) = 96 mod 5 = 1 ⇒ 충돌 발생 !

                     ⇒ 다음 버킷 중에서 비어있는 버킷 2 에 96 저장

⑤키 값 25 저장 : h(25) = 25 mod 5 = 0 ⇒ 충돌 발생 !

                     ⇒ 다음 버킷 중에서 비어있는 버킷 3 에 25 저장

5. 해싱

Page 68: 검색 / 탐색 (Search)

68/50

5. 해싱

Page 69: 검색 / 탐색 (Search)

69/50

체이닝 • 해시 테이블의 구조를 변경하여 각 버킷에 하나 이상의 키 값을 저장할 수

있도록 하는 방법•버킷에 슬롯을 동적으로 삽입하고 삭제하기 위해서 연결 리스트 사용

− 각 버킷에 대한 헤드노드를 1 차원 배열로 만들고 각 버킷에 대한 헤드노드는

슬롯들을 연결 리스트로 가지고 있어서 슬롯의 삽입이나 삭제 연산을 쉽게 수행할

수가 있다 .

− 버킷 내에서 원하는 슬롯을 검색하기 위해서는 버킷의 연결 리스트를 선형

검색한다 .

5. 해싱

Page 70: 검색 / 탐색 (Search)

70/50

체이닝을 이용한 오버플로우 처리 예• 해시 테이블의 크기 : 5

• 해시 함수 : 제산함수 사용 . 해시 함수 h(k) = k mod 5

• 저장할 키 값 : {45, 9, 10, 96, 25}

①키 값 45 저장 : h(45) = 45 mod 5 = 0

⇒ 해시 테이블 0번에 노드를 삽입하고 45 저장

②키 값 9 저장 : h(9) = 9 mod 5 = 4

⇒ 해시 테이블 4번에 노드를 삽입하고 9 저장

③키 값 10 저장 : h(10) = 10 mod 5 = 0

⇒ 해시 테이블 0번에 노드를 삽입하고 10 저장

④키 값 96 저장 : h(96) = 96 mod 5 = 1

⇒ 해시 테이블 1 번에 노드를 삽입하고 96 저장

⑤키 값 25 저장 : h(25) = 25 mod 5 = 0

⇒ 해시 테이블 0번에 노드를 삽입하고 25 저장

5. 해싱

Page 71: 검색 / 탐색 (Search)

71/50

5. 해싱

Page 72: 검색 / 탐색 (Search)

72/50 알고리즘 분석 72

% 이중 해싱 (double hashing)

클러스터링 문제를 해결 선형 탐사법은 두 번째 이후에 탐사되는 위치는 초기 탐사 위치에 따라

결정 두 번째 이후 탐사되는 위치가 첫 번째 탐사 위치와 무관하다면 클러스터링을 없앨 수 있음

Page 73: 검색 / 탐색 (Search)

73/50 알고리즘 분석 73

% 해시 함수의 예

h1(k): k mod 19

h2(k): 8 – (k mod 8)

Page 74: 검색 / 탐색 (Search)

74/50 알고리즘 분석 74

% 이중 해싱의 수행과정

Page 75: 검색 / 탐색 (Search)

75/50 알고리즘 분석 75

% 성능 특성

이중 해싱은 평균적으로 선형 탐사보다 적은 탐사 회수를 가짐

이중 해싱은 선형 탐사에 비해 작은 테이블 크기를 가지고도 동일한 탐색 성능을 나타냄

테이블이 80% 이하로 채워져 있을 경우 성공적이지 않은 탐색의 평균 탐사 회수는 5번 이하이며 , 99% 채워져 있을 경우 성공적인 탐색을 5번 이하로 할 수 있음

Page 76: 검색 / 탐색 (Search)

76/50 알고리즘 분석 76

% 해싱과 이진 트리

이진 트리보다 해싱을 많이 사용하는 이유 간단함 아주 빠른 탐색 시간

이진 트리의 장점동적 ( 삽입 회수를 미리 알고 있지 않아도 됨 ) 최악의 경우 성능을 보장 ( 해싱의 경우 아무리 좋은 해시 함수라도

모든 값을 같은 장소로 해싱하는 경우가 발생 ) 사용할 수 있는 연산의 종류가 많음 ( 예 : 정렬 연산 )

Page 77: 검색 / 탐색 (Search)

77/50 알고리즘 분석 77

% 기수 탐색 (radix searching)

탐색 키의 디지털 성질 (0과 1) 을 이용해 탐색을 위한 이진 트리를 만들어 탐색을 진행

탐색 키의 해당 비트가 0이면 왼쪽 자식을 방문하고 , 1이면 오른쪽 자식을 방문

탐색 키가 클 때는 노드를 방문할 때마다 탐색 키를 비교하는 것이 성능에 많은 영향을 줌

기수 탐색 알고리즘은 탐색 키의 비교 횟수를 줄이면서 기억 장소의 낭비를 줄이고 구현을 쉽게 하는 방향으로 개발되어 옴

Page 78: 검색 / 탐색 (Search)

78/50 알고리즘 분석 78

% 1~26 까지의 이진수

1: 00001 2: 00010 3: 00011 4: 001005: 00101 6: 00110 7: 00111 8: 010009: 01001 10: 01010 11: 01011 12: 0110013: 01101 14: 01110 15: 01111 16: 1000017: 10001 18: 10010 19: 10011 20: 1010021: 10101 22: 10110 23: 10111 24: 11000       25: 11001 26: 11010

Page 79: 검색 / 탐색 (Search)

79/50 알고리즘 분석 79

% 디지털 탐색 트리 (digital search tree)

탐색 키의 해당 비트가 0이면 왼쪽 , 1 이면 오른쪽으로 진행하여 단말 노드까지 이르면 그 곳에 새로운 노드를 삽입

노드를 방문할 때마다 탐색 키를 비교해야 하므로 탐색 키가 큰 경우 키 비교에 많은 시간이 걸림

Page 80: 검색 / 탐색 (Search)

80/50 알고리즘 분석 80

% 디지털 탐색 트리의 예

키 ( 1, 19, 5, 18, 3, 26, 9 )

1

1

19

0 11

19

0 1

50 1 0 1 0 1

1

19

0 1

50 1 0 1

180 1

1

19

0 1

50 1 0 1

180 1

30 1

1

19

0 1

50 1 0 1

180 1

30 1

260 1

1

19

0 1

50 1 0 1

180 1

30 1

260 1

90 1

1 (00001) 19 (10011) 5 (00101)

18 (10010) 3 (00011)

26 (11010) 9 (01001)

Page 81: 검색 / 탐색 (Search)

81/50 알고리즘 분석 81

% 성능 특성

장점 이해하기 쉽고 구현이 간단함

단점 탐색 키의 비트에 따라 노드를 방문 할 때마다 디지털 탐색 트리의 키와

탐색 키를 매번 비교해야 하므로 , 탐색 키가 큰 경우에는 키 비교에 많은 시간이 소요

Page 82: 검색 / 탐색 (Search)

82/50 알고리즘 분석 82

% 기수 탐색 트라이 (radix search trie)

트라이 (trie) : reTRIEval 에 유용하다고 하여 Fredkin 이 명명함

노드를 내부 노드와 외부 노드로 나누어 내부 노드는 탐색시 왼쪽과 오른쪽 이동만을 나타내고 키는 외부 노드에만 저장

탐색 키 비교는 외부 노드에서만 이루어지므로 탐색당 1번만 비교함

내부 노드는 키를 저장하지 않으므로 기억 장소의 낭비가 심하고 , 내부 노드와 외부 노드를 나누어 프로그래밍해야 하므로 프로그래밍하기가 어려움

Page 83: 검색 / 탐색 (Search)

83/50 알고리즘 분석 83

% 기수 탐색 트라이의 예

키 ( 1, 19, 5, 18, 3, 26, 9 )

1 (00001) 19 (10011) 18 (10010)5 (00101)

26 (11010) 9 (01001)

3 (00011)

Page 84: 검색 / 탐색 (Search)

84/50 알고리즘 분석 84

% 성능 특성

탐색 당 한 번의 키 비교만을 수행하므로 비교 시간을 절약 내부 노드에는 키를 저장하지 않으므로 기억 장소의 낭비 심함

내부 노드와 외부 노드를 나누어 관리해야 하므로 프로그래밍하기가 어려움

Page 85: 검색 / 탐색 (Search)

85/50 알고리즘 분석 85

% 외부 탐색 (external searching)

매우 큰 화일에 있는 데이터에 빠르게 접근하는 것은 많은 응용에서 매우 중요함

외부 탐색은 큰 디스크 화일을 주로 다룸 테이프 같은 순차 접근 장치는 순차 탐색 외에 별다른 탐색 방법이 없음

외부 탐색 기법은 이미 배운 내부 탐색 기법의 논리적 확장임 10 억개 이상의 데이타를 탐색하는데 불과 2∼3 회의 디스크 접근으로 가능함

디스크는 페이지로 구분되어 있으며 , 페이지는 많은 레코드를 가지고 있음

Page 86: 검색 / 탐색 (Search)

86/50 알고리즘 분석 86

% 인덱스된 순차 접근

탐색 속도를 높이기 위해 탐색 키가 디스크 상의 어떤 페이지에 있는지 가리키는 인덱스를 유지

인덱스 페이지는 데이터 페이지보다 많은 키와 페이지 인덱스 저장 가능

주기억 장치에 마스터 인덱스 유지 마스터 인덱스 : 디스크에 저장된 키 값에 대한 정보

인덱스된 순차 화일에서 탐색은 평균 2 번 이내의 디스크 접근을 필요로 하지만 , 삽입은 전체 화일을 재구성해야 하는 단점이 있음

Page 87: 검색 / 탐색 (Search)

87/50

키 5,24,20,5,18,14,1,12,19,5,1,18,3,8,9,14,7,5,24,1,13,16,12,5

순차 접근

인덱스된 순차 접근

알고리즘 분석 87

% 레코드 저장 예

Page 88: 검색 / 탐색 (Search)

88/50 알고리즘 분석 88

% 성능 특성

탐색은 평균 2 번 이내의 디스크 접근 필요 삽입은 전체 화일을 재구성해야 하는 단점

Page 89: 검색 / 탐색 (Search)

89/50 알고리즘 분석 89

% B- 트리

R. Bayer 와 E. McCreight 는 다방향 균형 트리를 외부 탐색에 최초로 사용함

균형 트리로서 각 노드가 M-1 개까지의 키 값을 가지고 M개의 포인터를 가짐

차수가 M인 B- 트리의 각 노드는 M/2 개 이상의 키 값을 가지도록 유지됨

트리를 내려 가다가 가득 찬 노드를 만나면 분할함 하나의 M- 노드가 연결된 k- 노드는 두 개의 (M/2)- 노드가 연결된

(k+1)- 노드로 분할됨루트 노드는 주기억 장소에 저장

Page 90: 검색 / 탐색 (Search)

90/50 알고리즘 분석 90

% B- 트리 접근의 예

키 5,24,20,5,18,14,1,12,19,5,1,18,3,8,9,14,7,5,24,1,13,16,12,5

Page 91: 검색 / 탐색 (Search)

91/50 알고리즘 분석 91

% 성능 특성

N 개의 데이터 레코드를 가지고 차수가 M인 B- 트리에서 주어진 키 값으로 탐색하거나 삽입할 때 필요한 디스크 접근 회수는 logM/2N 보다 작음

이 값은 N 개의 데이터 레코드를 가지고 모든 노드가 M/2개의 키 값을 가진 B- 트리를 구성했을 때의 높이에 해당함

Page 92: 검색 / 탐색 (Search)

92/50 알고리즘 분석 92

% B- 트리의 외부노드로 구성

내부노드에는 전체 레코드가 아닌 키 값만을 저장⇒ 상위 레벨에서 더 큰 M 값을 가질 수 있음

두 가지 분기 요소 MI : 내부노드에서 둘이나 네페이지에 저장할 수 있는 레코드의 수 MB : 외부노드에서 한 페이지에 저장할 수 있는 레코드의 수

예 : MI=2048 이고 3레벨을 가진 B- 트리는 수십억 개(10243) 이상의 원소를 다룰 수 있음

Page 93: 검색 / 탐색 (Search)

93/50 알고리즘 분석 93

% B- 트리의 외부노드로 구성의 예

MI = 8, MB = 5

루트노드 내부노드

외부노드

Page 94: 검색 / 탐색 (Search)

94/50

A B+-tree is a rooted tree that takes the form of a balanced tree in which every path from the root to a leaf is of the same length.

root node

internal node

leaf node

data block(records)

Each node has between n/2 and n children.

• If the root is an internal node, it has at least 2 children.

• If the root is a leaf, it can have between 0 and (n-1) values.

Each node has between (n-1)/2 and n-1 values.

The block stores records.

% B+- 트리

Page 95: 검색 / 탐색 (Search)

95/50

Typical node of a B+-tree

Ki are the search key values.

Pi are pointers.

In case of internal nodes (non-leaf nodes), they point children nodes.

In case of leaf nodes, they point records.

The search keys in a node are ordered

K1 < K2 < K3 < . . . . < Kn-1

P1 K1 P2 Pn-1 Kn-1 Pn

% B+- 트리

Page 96: 검색 / 탐색 (Search)

96/50

Properties of a leaf node:

For i = 1, 2, …, n-1, Pi points to a file record with search

key value Ki.

If Li, Lj are leaf nodes and i < j, Li’s search key values are

less than Li’s search key values.

Pn points to next leaf node in search key order.

Brighton Downtown

Brighton 217 Green 750

Downtown 101 Johnson 500

Downtown 110 Peterson 600

next leaf nodeaccount tableleaf node

% B+- 트리

Page 97: 검색 / 탐색 (Search)

97/50

Internal nodes form a multi-level sparse index on the leaf nodes.

For an internal node with m pointers:

P1 K1 P2 … Ki-1 Pi Ki … Km-1 Pm …

X X X

X < K1 Ki-1 X < Ki X Km-1

% B+- 트리

Page 98: 검색 / 탐색 (Search)

98/50

Perryridge

B+-tree for account file (n = 3)

Mianus Redwood

Brighton

Downtown

Mianus Perryridge

Redwood

Round Hill

Brighton 217 Green 750Downtown 101 Johnson 500

Downtown 110 Peterson 600

Mianus 215 Smith 700

Perryridge 102 Hayes 400

Perryridge 201 Williams 900

Perryridge 218 Lyle 700

Redwood 222 Lindsay 700

Round Hill 305 Turner 350

% B+- 트리

Page 99: 검색 / 탐색 (Search)

99/50

Perryridge

Mianus Redwood

Brighton

Downtown

Mianus Perryridge

Redwood

Round Hill

Insert “Clearview”

Perryridge

Downtown Mianus Redwood

Brighton

ClearviewDowntow

nPerryridg

eRedwood Round Hill

Brighton

ClearviewDowntownsplit of leaf node

Mianus

% B+- 트리 – Insertion 동작

Page 100: 검색 / 탐색 (Search)

100/50

Searches can be conducted efficiently since the B+-tree contains a relatively small number of levels.

Set of leaf nodes forms a simple relation having the search key as an attribute.

% B+- 트리

Page 101: 검색 / 탐색 (Search)

IT CookBook, C 로 배우는 쉬운 자료구조 ( 개정판 )