file structures 강의
DESCRIPTION
File Structures 강의. File Structures. 강의 내용 직접 화일 (Ch. 8 in “ 파일 구조” ) 다중키 화일 (Ch. 9 in “ 파일 구조” ) 다차원 공간 화일 (Ch. 10 in “ 파일 구조” ) 텍스트를 위한 화일 (Ch. 11 in “ 파일 구조” ) 데이타베이스 (Ch.12 in “ 파일구조” ). 직접 파일 (Direct File ) 의 개념 (1/5). Hash Structures. 임의 접근 파일 (random access file) - PowerPoint PPT PresentationTRANSCRIPT
Advanced Data Structuresby Yang-Sae Moon
Page 1
File Structures File Structures 강의강의
강의 내용• 직접 화일 (Ch. 8 in “ 파일 구조” )
• 다중키 화일 (Ch. 9 in “ 파일 구조” )
• 다차원 공간 화일 (Ch. 10 in “ 파일 구조” )
• 텍스트를 위한 화일 (Ch. 11 in “ 파일 구조” )
• 데이타베이스 (Ch.12 in “ 파일구조” )
File Structures
Advanced Data Structuresby Yang-Sae Moon
Page 2
직접 파일직접 파일 (Direct File )(Direct File ) 의 개념의 개념 (1/5)(1/5)
임의 접근 파일 (random access file)
• 임의의 레코드에 그 레코드의 키 값을 사용하여 그 키 값을 가지는 레코드에 랜덤하게( 직접적으로 ) 접근할 수 있는 파일(= 직접 파일 (direct file), 직접 접근 파일 (direct access file))
• 다른 레코드를 참조하지 않고도 , 개개의 레코드에 접근 가능 (↔ 순차 접근 파일 )
인덱스 활용• 인덱스된 파일 (indexed file): 별도로 관리되는 인덱스를 이용하여 레코드에 직접
접근
• 인덱스된 순차 파일 (indexed sequential file): 인덱스를 이용한 임의 접근 /순차 접근을 모두 지원 (B+- 트리 )
해싱 (hashing) 활용• 상대 파일 (relative file): 물리적 주소 대신에 상대적인 번호 /값으로 접근 가능
( 예 : 레코드 번호 = 10 위치 ( 주소 ) = 10 x 100 bytes = 1000)
• 해시 파일 (hash file)
- 키 값을 사용하여 레코드의 저장 주소 생성 . 상대 파일을 주로 활용함 .
- 협의의 의미에서의 직접 파일
Hash Structures
Advanced Data Structuresby Yang-Sae Moon
Page 3
상대화일
-- 레코드의 상대적인 정보 ( 상대적인 레코드 번호 ) 를 사용하여 레코드에 접근
상대 레코드 번호 (relative record number)
• 파일이 시작되는 첫 번째 레코드를 1번으로 지정 , 이것을 기준으로 다음 레코드들에 2, 3, 4, …, n 의 순서를 지정 (= 상대 주소 (relative address))
• 레코드의 논리적 순서와 물리적 순서는 무관 , 즉 , 레코드들이 키 값에 따라 물리적으로 정렬되어 있을 필요는 없음
Hash Structures직접 파일직접 파일 (Direct File )(Direct File ) 의 개념의 개념 (2/5)(2/5)
Advanced Data Structuresby Yang-Sae Moon
Page 4
사상 함수 (mapping function)
A: 키 값 주소 // A(key) = address
• 레코드 기록 시 : 키 값 → 레코드가 저장될 주소
• 레코드 검색 시 : 키 값 → 레코드가 저장되어있는 주소
• 모든 레코드에 직접 접근 가능
→ 주기억 장치의 데이터 구조에서 활용이 가능함( 실제 , 교환기의 DBMS 에서는 이러한 간략하면서 Powerful 한 액세스 방법을 사용함 )
사상 함수의 구현 방법 (will be explained in the next slides)
• 직접 사상 (direct mapping)
• 디렉토리 검사 (directory lookup)
• 계산 (computation) 을 이용한 방법 해싱
Hash Structures직접 파일직접 파일 (Direct File )(Direct File ) 의 개념의 개념 (3/5)(3/5)
Advanced Data Structuresby Yang-Sae Moon
Page 5
직접 사상 (Direct Mapping)
• 절대 주소 (absolute address) 이용
− 키 값은 그 자체가 레코드의 실제 주소임
− 레코드가 파일에 처음 저장될 때 레코드의 주소에 해당하는 < 실린더 번호 , 디스크 번호 , 블록 번호 >, 즉 절대 주소가 결정됨
• 장점 : 간단하며 처리 시간이 거의 걸리지 않음
• 단점 : 물리적 저장장치에 의존적(→ 특수한 경우를 제외하고는 , 잘 사용되지 않음 )
Hash Structures직접 파일직접 파일 (Direct File )(Direct File ) 의 개념의 개념 (4/5)(4/5)
Advanced Data Structuresby Yang-Sae Moon
Page 6
디렉토리 검사 (Directory Lookup)
• < 키 값 , ( 상대 ) 주소 > 의 쌍을 엔트리로 하는 테이블 ( 디렉토리 ) 을 유지
• 검색 절차 : 디렉토리에서 키 값 검색 → 키 값에 대응되는 레코드 번호 ( 상대 주소 ) 구함 → 레코드 접근
Hash Structures
• 장점 : 빠른 검색
• 단점 : 삽입 비용이 크며 , 종종 파일과 디렉토리 재구성 필요
• 구현 예
− < 키 값 , 레코드 번호 > 쌍을 엔트리로 갖는 배열
− 디렉토리 엔트리는 키 값으로 정렬
− 순차 접근은 가능하나 의미는 없음
직접 파일직접 파일 (Direct File )(Direct File ) 의 개념의 개념 (5/5)(5/5)
Advanced Data Structuresby Yang-Sae Moon
Page 7
Hash Structures해싱 개요 해싱 개요 (1/2)(1/2)
Advanced Data Structuresby Yang-Sae Moon
Page 8
해싱 함수 (Hashing Function)
• 키 공간을 주소 공간으로 사상 (mapping)
h( 키 값 ) = 주소 , 주소 ⊂ 유효 주소 공간 (effective address space)
• 키 값들을 한정된 주소 공간으로 균등하게 분산시키는 것이 핵심
Hash Structures해싱 개요 해싱 개요 (2/2)(2/2)
Advanced Data Structuresby Yang-Sae Moon
Page 9
버킷 크기 (bucket size):하나의 주소를 가진 저장 구역 (= 버킷 ) 에 저장할 수 있는 레코드 수
적재 밀도 (loading density):총 저장 용량에 대한 실제로 저장되는 레코드 수의 비율
해싱 함수 (hashing function):레코드 키 값으로부터 레코드가 저장된 위치 ( 주소 ) 를 생성하는 방법
오버플로우 (overflow) 해결 방법 :주어진 주소 공간이 만원 (full) 이 된 경우의 해결 방법
Hash Structures해싱 사용 시 고려사항해싱 사용 시 고려사항
Advanced Data Structuresby Yang-Sae Moon
Page 10
버킷 (bucket): 하나의 주소를 가진 하나의 저장 구역
• 하나 이상 지정된 개수의 레코드 저장함
• 동일 버킷 내의 레코드들은 모두 동일한 버킷 주소를 가짐
• 한 파일을 구성하는 구성하는 버킷 수가 그 파일의 주소 공간이 됨
버킷 크기 (bucket size)
• 통상적으로 한 번의 접근 (I/O Access) 으로 버킷 내에 있는 모든 레코드들을
전송할 수 있는 크기로 결정
• 저장 장치의 물리적 특성과 연관
• 일반적으로 한 개의 블록 ( 혹은 페이지 ) 크기로 설정됨
Hash Structures버킷 크기 버킷 크기 (1/2)(1/2)
Advanced Data Structuresby Yang-Sae Moon
Page 11
충돌 (collision)
• 두 개의 상이한 레코드가 동일한 버킷으로 해싱되는 경우
• 동거자 (synonyms): 같은 주소로 해싱되어 충돌된 키 값들을 일컬음
• 버킷이 만원일 때는 충돌이 문제가 됨 → 오버플로우 (overflow) 발생
버킷 크기를 크게하면
• 오버플로우가 감소하는 장점이 있으나 ,
• 저장 공간의 효율이 감소되고 , 버킷 내 레코드 탐색 시간이 증가하는 단점이
있음
Hash Structures버킷 크기 버킷 크기 (2/2)(2/2)
Advanced Data Structuresby Yang-Sae Moon
Page 12
적재 밀도 (loading density) (= 패킹 밀도 (packing density))
• N : 버킷의 수
• c : 버킷의 용량 ( 하나의 버킷에 저장될 수 있는 레코드 개수 )(c x N = 파일에 저장 가능한 총 레코드 수 )
• K : 파일에 저장된 레코드 수
Hash Structures적재 밀도 적재 밀도 (1/2)(1/2)
적재 밀도 =
저장된 레코드 수
파일 저장 공간의 총 용량
=K
< 1c x N
Advanced Data Structuresby Yang-Sae Moon
Page 13
적재 밀도가 높으면 ,
• 삽입 시 접근 수가 증가함 ( 이미 레코드가 저장된 주소에 해싱될 경우가 많기 때문 )
• 검색 시 접근 수가 증가함 ( 원치 않는 레코드가 저장된 주소에 해싱될 경우가 많기 때문 )
적재 밀도가 낮으면 , 공간 효율이 떨어짐
실험 결과에 따르면 , 적재 밀도 > 70% 이면 충돌이 너무 잦음 30% 정도의 예비 공간이 필요함
예 ) 학생 레코드 검색 시스템
• 학생 수가 최대 60,000 명 , 예비 공간 30%, 버킷 크기 12
• 적정 버킷 수 = 60,000 / 0.7 / 12 = 7143
Hash Structures적재 밀도 적재 밀도 (2/2)(2/2)
Advanced Data Structuresby Yang-Sae Moon
Page 14
해싱 함수 ( 변환 함수 ): 키 버킷 주소• 해싱 함수 계산 시간 << 보조기억장치 ( 예 : 디스크 ) 의 버킷 접근 시간
• 모든 주소에 대한 균일한 분포를 가지는 것이 가장 중요한 요소임
주소 변환 과정• 단계 ① : 키가 숫자가 아닌 경우 ( 예를 들어 , 스트링인 경우 ), 키를 정수 값 (A) 으로
변환
키 → A
• 단계 ② : 변환된 정수 A 를 해싱 함수를 사용하여 주소 공간의 정수 B 로 변환
A → B (B : 균일 분포로 변환 )
• 단계 ③ : 얻어진 정수 B 를 주소공간의 실제범위에 맞게 조정
B 조정상수 → 주소 ( 실제 목표 주소로 변환 )
• 예 ) “kim”
− 단계 ① : ‘k’11, ‘i’9, ‘m’13, “kim” 11913
− 단계 ② : h(11973) = 11973 % 1000 = 973 (0 h(key) 999)
− 단계 ③ : 973 x 0.5 = 486 (0 address 499)
Hash Structures해싱 함수해싱 함수 (Hashing Function)(Hashing Function)
Advanced Data Structuresby Yang-Sae Moon
Page 15
나머지 함수 = 제산 잔여 (divide and remainder)
• 주소 = key value mod divisor (h(k) = k % d)
• 0 h(k) divisor – 1
Divisor ( 제수 )
• Divisor 자체가 직접 주소 공간의 크기를 결정 (0 ~ divisor - 1)
• 충돌 가능성이 가장 작은 것으로 선택
− 소수 (prime number)
− 20 보다 작은 소수를 인수로 갖지 않는 비소수( 예 : 5003 5000 에 가까우면서 20 이하의 소수를 인수로 갖지 않는 비소수 )
적당한 성능을 위한 적재 밀도는 0.7 ~ 0.8
• n 개의 레코드 1.25n 주소 공간 (1/1.25 = 80% 인 경우 )
• 적재 밀도와 주소 공간을 고려하여 divisor 를 결정함
Hash Structures나머지 함수 나머지 함수 (Modular Function) (Modular Function) (1/2)(1/2)
Advanced Data Structuresby Yang-Sae Moon
Page 16
Divisor 를 결정과 이에 따른 해싱의 예
• 레코드 개수가 4,000 개 , 적재 밀도 = 80%
• 주소 공간 = 4,000 / 0.8 = 5,000 개 주소 공간이 필요
• Divisor = 5,003(20 이하의 수를 인자로 갖지 않는 수 중에서 5,000 에 가장 가까운 수를 선택한 경우 )
Hash Structures나머지 함수 나머지 함수 (Modular Function) (Modular Function) (2/2)(2/2)
Divisor 가 5003인 경우의 예
Advanced Data Structuresby Yang-Sae Moon
Page 17
키 값을 제곱하고 , 중간에서 n 개 ( 주소 공간 ) 의 수를 취함
예 ) 레코드가 4,000 개인 경우• 최소 네 자리의 주소 공간이 필요
• 키를 제곱한 수에서 네 자리 수를 취함
주소 공간이 작거나 큰 경우 , 적절한 상수를 곱해서 주소 값을 조절함
Hash Structures중간 제곱중간 제곱 (Mid-Square) (Mid-Square) 해싱해싱
중간 제곱 해싱 예
( 뒤에서부터 7~10 자리 수 취함 )
Advanced Data Structuresby Yang-Sae Moon
Page 18
키 값을 주소 공간과 같은 자리 수를 가지는 몇 개의 부분으로 나누고 ,
이들을 접어서 (folding 해서 ) 그 합을 구함
Hash Structures중첩중첩 (Folding) (Folding) 해싱해싱
0001 2345 6789
1 0 0 0
2 3 4 5
9 8 7 6
3 2 2 11
주소
예 ) 주소 크기 (4 자리 ), 키 값(123456789)
키 값 주 소
123456789 3221
987654321 8999
123456790 4321
555555555 6110
000000472 2740
100064183 4820
200120472 4752
200120473 5752
1174000002740 ** 충돌 **
0270004002740 ** 충돌 **
Advanced Data Structuresby Yang-Sae Moon
Page 19
Hash Structures숫자 추출숫자 추출 (Digit Extraction) (Digit Extraction) 방법방법
숫자 분석 (Digit Analysis) 방법이라고도 함
키 값을 구성하는 각 digit 의 분포를 이용
키들의 모든 자릿수에 대한 빈도 테이블을 만들고 ,어느 정도 균등한 분포를 갖는 자릿수를 주소라 사용• 예 ) 주민등록번호의 경우 (YyMmDd 에서 , y, m, d 는 Y, M, D 에 비해 균등한
성질을 가짐 )
• 키 값을 구성하는 각 digit 의 분포를 미리 알고 있을 경우에 유용
예제 : 키 값의 9th, 7th, 5th, 3rd 자리로 주소를 구성• h(123456789) = 9753
• h(987654321) = 1357
• h(000000472) = 2400
Advanced Data Structuresby Yang-Sae Moon
Page 20
Hash Structures숫자 이동숫자 이동 (Shifting) (Shifting) 방법방법
키 값을 중앙을 중심으로 양분한 뒤 ,
주소 길이만큼 겹치도록 안쪽으로 각각 Shift 하여 해쉬 값을 구한 후 ,
주소 범위에 맞도록 조정 ( 조정 상수 사용 )
15
26
37
48
d1 d2 d3 d4 d5 d6 d7 d8
주소 길이
1 2 3 4 5 6 7 8
6 9 1 2
키 :
주소 :
주소 공간이 5,000 인 경우 ,6,912 x 0.5 = 3,456 (= 실제 주소 )
Advanced Data Structuresby Yang-Sae Moon
Page 21
Hash Structures진수 변환 진수 변환 (Radix Conversion)(Radix Conversion)
키 값의 진수를 다른 진수로 변환
초과하는 높은 자리 수는 절단
주소 범위에 맞도록 조정 ( 조정 상수 사용 )
예제 : 10 진수를 11 진수로 변환• 키 값 = 172148
• 주소 공간 = 7000
• h(172148)= 1 x 115 + 7 x 114 + 2 x 113 + 1 x 112 + 4 x 111 + 8 x 110
= 266373
• 조정 상수 적용 : 6373 x 0.7 = 4461
Advanced Data Structuresby Yang-Sae Moon
Page 22
Hash Structures충돌과 오버플로우 충돌과 오버플로우 (1/2)(1/2)
( 키 값 공간 > 주소 공간 ) (e.g., 주민번호 = 1013 > 주소공간 = 108)
충돌 (collision) 불가피
오버플로우 (overflow)
• 동일한 주소 (home address) 로 충돌된 동거자 (synonyms) 들을 한 버킷에
모두 저장할 수 없는 경우
• 해싱에서는 해싱 함수의 선택과 함께 , 오버플로우 처리가 주된 이슈임
Advanced Data Structuresby Yang-Sae Moon
Page 23
Hash Structures충돌과 오버플로우 충돌과 오버플로우 (2/2)(2/2)
오버플로우 해결 방법
• 개방 주소법 (open addressing): 오버플로우된 동거자를 저장할 공간을
상대 파일 내의 공간에서 해결
• 체인법 (chaining): 오버플로된 동거자를 위한 저장 공간을 상대 파일 밖의
지정된 공간에서 해결 , 즉 독립된 오버플로우 구역을 유지
• 선형 조사 (linear probing) // 개방 주소법
• 독립 오버플로우 구역 (separate overflow area) // 체인법
• 이중 해싱 (double hashing) // 체인법
• 동거자 체인 (synonym chaining) // 체인법
• 버킷 주소법 (bucket addressing) // 체인법 , 개방
주소법
Advanced Data Structuresby Yang-Sae Moon
Page 24
Hash Structures선형 조사 선형 조사 (Linear Probing) (1/5)(Linear Probing) (1/5)
오버플로우 발생 시 , home address 부터 차례로 조사하여 가장 가까운 빈 공간을 찾는 방법
해당 주소가 공백인지 아닌지를 판별할 수 있어야 함 플래그 (flag) 활용
레코드 플래그
record or not T/F
∙ ∙ ∙ ∙ ∙ ∙
record or not T/F
… (x) … T
… (y) … T
record or not T/F
∙ ∙ ∙ ∙ ∙ ∙
record or not T/F
0
i-1
ii+1i+2
n
h(x) = i
h(y) = i
Advanced Data Structuresby Yang-Sae Moon
Page 25
Hash Structures
저장 ( 삽입 )• 원형 (circular) 탐색 : 빈 주소를 조사하는 과정은 home address 에서
시작하여 파일 끝에서 끝나는 것이 아니라 다시 파일 시작으로 돌아가는 방식(C 의 경우 % 연산을 사용하여 구현 )
• 검색 과정에서 빈 공간이 발생하면 해당 공간에 레코드를 저장
검색• 레코드 저장 시 , 선형 조사를 사용했다면 검색에서도 선형 조사를 사용해야
함
• 키 값을 가진 레코드가 없거나 home address 에서 먼 경우 , 많은 조사 필요
삭제• 삭제로 인해 만들어진 빈 공간으로 검색 시 선형 조사가 단절될 수 있음
→ 삭제 표시 (tombstone) 이용 : 삭제된 자리에 삭제 표시를 해서 선형 조사가 단절되지 않도록 해야 함
선형 조사 선형 조사 (Linear Probing) (2/5)(Linear Probing) (2/5)
Advanced Data Structuresby Yang-Sae Moon
Page 26
Hash Structures
장점• 구현이 ( 매우 ) 용이함
• 충돌이 적은 경우 ( 해슁 함수가 Good 혹은 저장 공간이 많은 경우 ) 에 빠른 성능을 보임
단점• 충돌이 많을 경우 , 레코드의 검색 ( 특히 , 어떤 레코드가 파일에 없다는 것을 판단 ) 하기 위해 많은 시간이 소요 특히 , 적재 밀도가 높을 수록 시간이 많이 걸림
• 검색 시간을 줄이기 위해서 , 적당한 적재 밀도의 유지가 필요함
• 삽입 /삭제를 반복하면서 환치 (displacement) 가 발생할 수 있음 next page
선형 조사 선형 조사 (Linear Probing) (3/5)(Linear Probing) (3/5)
Advanced Data Structuresby Yang-Sae Moon
Page 27
Hash Structures
환치 (displacement)• 자기 주소를 동거자가 아닌 레코드가 차지함으로 인해 , 자기 주소가 아닌
다른 레코드의 주소에 저장되는 것
• 다른 환치를 유발 (A 는 B 의 주소에 저장되고 , B 는 C 의 주소에 저장되고 , …)
• 탐색할 주소 수 증가 → 삽입 /검색 시간의 증가를 야기함
• 대응책 : 2- 패스 해시 파일 생성 (two-pass hash file creation)
선형 조사 선형 조사 (Linear Probing) (4/5)(Linear Probing) (4/5)
Advanced Data Structuresby Yang-Sae Moon
Page 28
Hash Structures
2- 패스 해시 파일• 첫 번째 패스
- 모든 레코드를 해시 함수를 통해 home address 에 저장
- 충돌이 일어나는 동거자들은 바로 저장하지 않고 별도의 임시 파일에 저장
• 두 번째 패스
- 임시 파일에 저장해 둔 동거자들을 선형 조사를 이용하여 파일에 모두 저장
• 첫 번째 패스 생성에 비해 훨씬 많은 레코드들이 원래 자기 홈 주소에 저장됨
• 파일 생성 이전에 레코드 키 값들을 미리 알 수 있는 경우에 효율적임
• 파일이 생성된 후에 레코드들이 추가될 때는 환치 (displacement) 발생
선형 조사 선형 조사 (Linear Probing) (5/5)(Linear Probing) (5/5)
Advanced Data Structuresby Yang-Sae Moon
Page 29
Hash Structures
별개의 오버플로우 구역 (separate overflow area) 을 할당하여 , 오버플로우된 모든 동거자들을 순차로 저장하는 방법
독립 오버플로우 구역독립 오버플로우 구역
0n
……
0i+1
1i
1i-1
0
…
12
01
레코드
m
……
2
1
독립오버플로 구역overflowflag
다음 가용공간
장점• 동거자가 없는 레코드에
대해서는 한번의 주소 접근만으로 레코드를 검색
• 환치 문제를 제거
단점• 오버플로우된 동거자를
접근하기 위해서는 오버플로우 구역에 있는 모든 레코드들을 순차적으로 검색
Advanced Data Structuresby Yang-Sae Moon
Page 30
Hash Structures
오버플로우된 동거자들을 오버플로우 구역으로 직접 해싱• 오버플로우 구역에서의 순차 검색을 피할 수 있음
• 이차 해시 함수 (second hash function): 오버플로우된 동거자들을 해슁하는 함수
해싱 과정• 일차 해시 함수에 의해 상대 파일로 해슁
→ 오버플로우가 발생하면 오버플로우 구역으로 이차 해슁
• 오버플로우 구역에서 다시 충돌이 일어나면 선형 조사를 이용
장단점• 오버플로우 구역에서 순차검색을 피할 수 있어 , 충돌 시 검색이 빠름
• 두 개의 해쉬 함수를 유지해야 하며 , 충돌이 빈번한 경우 오버플로우 구역에서 환치와 같은 선형 조사의 문제점이 다시 발생함
이중 해싱 이중 해싱 (double hashing)(double hashing)
Advanced Data Structuresby Yang-Sae Moon
Page 31
Hash Structures
각 주소마다 링크를 두어 오버플로우된 레코드들을 연결하는 방법• 오버플로우가 일어나면 선형 조사나 오버플로우 구역을 이용해서 저장 후 , 처음 해시
주소에 동거자를 포함하고 있는 주소에 대한 링크를 둠
• 동거자에 대한 액세스는 링크로 연결된 동거자들만 조사해 보면 됨
• 독립 오버플로우 구역에 사용할 수도 있고 , 원래의 상대 파일에 적용할 수도 있음
장점• Home address 에서의 충돌이 감소됨
• 충돌 시 순차 검색을 피할 수 있어 , 검색 시간이 단축됨
단점• 각 주소가 링크 필드를 포함하도록 확장해야 함
동거자 체인 동거자 체인 (Synonym Chaining) (Synonym Chaining) (1/2)(1/2)
Advanced Data Structuresby Yang-Sae Moon
Page 32
Hash Structures
동거자 체인 + 독립 오버플로우 구역 예
동거자 체인 동거자 체인 (Synonym Chaining) (Synonym Chaining) (2/2)(2/2)
-1n
·
·
i+1
-1i
i-1
·
·
·
-12
-11
링크레코드
-1m
·
·
·
·
·
-14
-13
2
-11
링크레코드
동거자오버플로우 구역
Advanced Data Structuresby Yang-Sae Moon
Page 33
Hash Structures
버킷에 복수 개의 레코드 저장 공간을 관리하여 , 해싱 함수는 키 값을 레코드 주소가 아닌 버킷 주소로 사상함• 하나의 해시 주소에 가능한 최대 수의 동거자를 저장할 수 있는 공간을 할당함
• 특정 해시 주소를 갖는 모든 동거자들은 그 주소의 버킷에 순차적으로 저장함
→ ( 일반적으로 ) 한 레코드를 검색하기 위하여 조사해야 될 레코드 수는 최대로 버킷 사이즈에 한정됨 ( 오버플로우 구역 탐색 , 파일 전체 탐색 불필요 )
문제점• 공간의 낭비 : 각 해시 주소에 대한 동거자의 수가 다양하고 그 차이가 아주 클 때
- 버킷 크기는 해시 주소에 대한 최대 동거자 수로 정하는 것이 보통 → 이 경우 공간 낭비가 심함
• 버킷 크기 설정
- 파일 생성 전에 데이터를 분석할 수 없을 때 , 설정이 어려움
- 버킷 크기가 충분치 않으면 오버플로우 발생 → 충돌 해결 기법 필요
버킷 주소법 버킷 주소법 (1/3)(1/3)
Advanced Data Structuresby Yang-Sae Moon
Page 34
Hash Structures
버킷 주소법에서의 충돌 해결• 여유 공간을 가진 가장 가까운 버킷을 사용하는 방법
→ 환치 등의 선형 조사와 동일한 단점
버킷 체인 (bucket chaining)
• 홈 버킷에서 오버플로우가 발생하면 , 별도의 버킷을 할당한 후 해당 동거자를 저장하고 홈 버킷에 이 버킷을 링크로 연결
• 장점 : 재해싱 불필요
• 단점 : 한 레코드를 탐색하기 위해서는 최악의 경우 그 홈 버킷에 연결된 모든 오버플로우 버킷을 조사해야 함
버킷 주소법 버킷 주소법 (2/3)(2/3)
Advanced Data Structuresby Yang-Sae Moon
Page 35
Hash Structures
성공적 탐색• 어떤 다른 방법보다도 평균 조사
수가 더 작음
실패 탐색• 성공적 탐색과 비슷하거나 더 작은
조사 수를 보임 ( 독립 오버플로우 구역과 버킷 주소법을 사용하는 경우 )
버킷 주소법 버킷 주소법 (3/3)(3/3)
-1n
·
·
i+1
-1I
i-1
···
2
-11
링크레코드레코드
-1m
-1m-1
-1
-1
-13
2
-11
링크레코드
동거자오버플로우 구역
Advanced Data Structuresby Yang-Sae Moon
Page 36
Hash StructuresAdvanced Hashing TechniquesAdvanced Hashing Techniques
테이블 이용 해슁 :Signature 를 사용한 신속한 해싱 방법
확장성 직접 파일 :레코드 개수가 지속적으로 증가하는 경우를 위한 , 해슁 파일의 동적 관리가 주 목적임• 가상 해싱 (Virtual Hashing)
• 동적 해싱 (Dynamic Hashing)
• 확장 해싱 (Extendible Hashing)
• 선형 해싱 (Linear Hashing)
Advanced Data Structuresby Yang-Sae Moon
Page 37
Hash Structures
한번의 디스크 접근으로 검색을 보장하는 방법• 해싱 테이블 : 키 → < 버킷 주소의 순열 , k- 비트 시그너쳐 (signature) 의 순열 >
생성
• 디렉토리 테이블 : < 버킷 주소 , k- 비트 시그너쳐 > 로 구성
• 해싱 테이블과 디렉터리 테이블 : 주기억 장치에 유지
• 레코드 삽입과 삭제는 시간이 많이 소요되나 , 검색은 매우 빠름
예 )k = 5 일 때 , 버킷 주소와 시그너쳐의 순열 ( 해싱 테이블 )
테이블 이용 해싱 테이블 이용 해싱 (1/3)(1/3)
키 버킷 주소 5- 비트 시그너쳐
WhiteBlueLilacRed
Green
85 87 89 91 93 …85 86 87 88 89 …85 90 95 0 5 …85 92 99 6 13 …85 86 87 88 89 …
00101 01001 10100 10111 …00110 00011 00110 10000 …01000 10100 11000 10100 …00010 11000 11110 10010 …00011 00100 10001 00111 …
Advanced Data Structuresby Yang-Sae Moon
Page 38
Hash Structures
삽입의 예• 버킷 크기 = 3, 각 레코드의 홈 버킷 = 85,
레코드 삽입 순서 = White, Blue, Lilac, Red, Green
• 네 번째 Red 를 삽입할 때 , 오버플로우가 발생함
- Red( 시그너쳐 00010 = 2), White( 시그너쳐 00101 = 5), Blue( 시그너쳐 00110 = 6),Lilac ( 시그너쳐 01000 = 8)
- 시크너쳐 값의 크기 ( 순서 ) 에 의해 , Red, White, Blue 는 85 번 버킷에 저장
- Lilac 은 90 번 버킷에 저장 ( 앞서의 해싱 테이블을 보면 버킷 85 다음에 버킷 90 임 )
• 레코드를 버킷에 저장할 때마다 디렉토리 테이블을 유지함
- 엔트리 = ( 버킷 번호 ( 주소 ), 시그너쳐 값 )
- 시그너쳐 값은 초기치 (11111) 에서 버킷 오버플로우가 발생한경우에만 ( 오버플로우가 처음 발생한 키의 시그너쳐 값으로 ) 변경
- Red, White, Blue 는 버킷 85 에 저장 = (85, 01000) 01000 오버플로우가 발생한 Lilac 의 시그너쳐 값
- Lilac 은 버킷 90 에 저장 = (90, 11111)
테이블 이용 해싱 테이블 이용 해싱 (2/3)(2/3)
디렉토리 테이블
버킷 주소 시그너쳐
…8485868790…
…1111101000111111111111111
…
Advanced Data Structuresby Yang-Sae Moon
Page 39
Hash Structures
검색 : 아주 효율적임• 검색할 키 ( 예 : White) 로부터 다음 정보를 생성함 ( 해싱 테이블 참
조 )
- 버킷 1(= 85), 시그너쳐 1(= 00101)
- 버킷 2(= 87), 시그너쳐 2(= 01001)
- 버킷 3(= 89), 시그너쳐 3(= 10100)
- …
• 다음을 만족하는 가장 작은 i를 구함
- 시그너쳐 i < 버킷 i의 분리 값 ( 시그너쳐 ), i = 1, 2, 3, …
- 검색 레코드는 버킷 i에 존재
• 예 ) White 검색 시 ,
85 87 89
00101 01001 10100
- 시그너처 1(00101) < 테이블 버킷 85(= 01000),따라서 , 검색할 버킷 번호는 85 임
테이블 이용 해싱 테이블 이용 해싱 (3/3)(3/3)
디렉토리 테이블
버킷 주소 시그너쳐
…8485868790…
…1111101000111111111111111
…
Advanced Data Structuresby Yang-Sae Moon
Page 40
Hash Structures
현재까지는 레코드 개수 ( 의 최대치 ) 가 고정 ( 한정 ) 된 경우를 다룸
레코드 수의 변화가 큰 경우는 ? 확장성 직접 파일
K: 어느 한 시점에서 파일에 저장된 레코드 개수
• Kmin ≤ K ≤ Kmax ( 최소 Kmin 개에서 최대 Kmax 개의 레코드를 가짐 )
• SPAN = Kmax ÷ Kmin (SPAN 이 클 때 , 즉 , 변화가 많을 때 문제가 됨 )
• K ≈ Kmin: 공간 이용률 낮음
• K ≈ Kmax: 적재 밀도가 높음 ( 저장과 검색 시간이 오래 걸림 )
- 해결 방안 : 재해싱 ( 많은 시간이 소요됨 , 재해싱 동안 액세스 못함 )
확장성 직접 파일 확장성 직접 파일 (1/2)(1/2)
Advanced Data Structuresby Yang-Sae Moon
Page 41
Hash Structures
확장성 파일 : 높은 SPAN 값을 가진 파일에 대한 해싱 기법
• 가상 해싱 (virtual hashing)
• 동적 해싱 (dynamic hashing)
• 확장 해싱 (extendible hashing)
• 선형 해싱 (Linear hashing)
확장성 직접 파일 확장성 직접 파일 (2/2)(2/2)
Advanced Data Structuresby Yang-Sae Moon
Page 42
Hash Structures
여러 개의 관련된 해싱 함수를 사용
해싱 함수 : 나머지 함수 (modular function) 를 사용• h0: 주소 = 키 mod N (N = 20N)
• 버킷의 수 = N, 버킷 크기 = C
오버플로우가 발생하면 ,
• 관련된 버킷을 분할
• 상이한 함수를 사용하여 , C+1 개의 레코드를 재해싱
• 재해싱 함수 hj: 주소 = 키 mod (2j x N), j = 0, 1, 2, ...
- h1: 주소 = 키 mod 21N
- h2: 주소 = 키 mod 22N
가상 해싱 가상 해싱 (Virtual Hashing) (1/3)(Virtual Hashing) (1/3)
Advanced Data Structuresby Yang-Sae Moon
Page 43
Hash Structures
가상 해싱의 예• 버킷 수 N = 100, 버킷 크기 C = 4
• 버킷 3 = [3, 103, 203, 303] 으로 만원 (full)
• 첫 번째 해싱 함수 h0 = key mod 100
새 레코드 403 삽입 시 , 오버플로우 발생
다음 해싱 함수 h1 = key mod 200 을 이용하여 버킷 분할
가상 해싱 가상 해싱 (Virtual Hashing) (2/3)(Virtual Hashing) (2/3)
버킷 3 (100 [0 ~ 99])
3103203303
버킷 3 (200 [0 ~ 99])
3203403
버킷 103 (200 [100 ~ 199])
103303
Advanced Data Structuresby Yang-Sae Moon
Page 44
Hash Structures
가상 해싱의 예 ( 계속 )
새로운 레코드 603, 803 삽입 시 , 버킷 3 오버플로우 발생
다음 해싱 함수 h2 = key mod 400 을 이용하여 버킷 분할
가상 해싱 가상 해싱 (Virtual Hashing) (3/3)(Virtual Hashing) (3/3)
버킷 3 (400 [0 ~ 99])
3403803
버킷 103 (200 [100 ~ 199])
103303
버킷 203 (400 [200 ~ 299])
203603
어떤 함수를 적용 ? 각 버킷에 적용된 해싱 함수를 유지해야 함 검색할 키 값에 적용할 해싱 함수 hk 를 알 수 있어야 함
Advanced Data Structuresby Yang-Sae Moon
Page 45
Hash Structures
파일 구성• 크기가 C 인 N 개의 버킷 ( 디스크 블록 /페이지 )
• 각 버킷을 지시하는 인덱스 ( 주기억 장치 )
동적 해싱의 예• N = 20, C = 3 일 때 , 초기 동적 해시 파일
• 초기에는 인덱스가 한 레벨 ( 레벨 0) 임
동적 해싱 동적 해싱 (Dynamic Hashing) (1/8)(Dynamic Hashing) (1/8)
Advanced Data Structuresby Yang-Sae Moon
Page 46
Hash Structures
두 개의 해싱 함수 사용• 해싱 함수 H0: 레벨 0 인덱스 엔트리의 한 주소로 변환 (Binary Tree 의 루트 식별 )
- H0(key) = index value (1 ~ N)
- 버킷이 계속 분할되면 , 인덱스는 N 개 Binary Tree 의 Forest 가 됨
• 비트 함수 B: 키 값을 임의 길이의 Bit String 으로 변환
- 각 인덱스 트리 내에서의 분기 결정
- 해싱 함수로 Binary Tree 를 결정하고 , Binary Tree 내에서의 검색은 비트 함수를 활용
저장 절차• 키를 레벨 0 인덱스 엔트리의 한 주소로 변환 ( 해싱 함수 H0 를 이용 )
• 인덱스 엔트리의 포인터를 통해 버킷에 접근한 후 레코드를 저장
• 버킷이 만원인 경우 , 버킷을 새로 할당하여 ( 이미 저장된 레코드들 + 새로 저장할 레코드 ) 를 분할 저장
동적 해싱 동적 해싱 (Dynamic Hashing) (2/8)(Dynamic Hashing) (2/8)
Advanced Data Structuresby Yang-Sae Moon
Page 47
Hash Structures
검색 절차• H0(key) 함수에 의한 값 (1 ~ N) 으로 Forest 에서 Binary Tree 의 루트를 식별하고 ,
• B(key) 함수에 의한 Bit String 값으로 인덱스 레벨 1 부터 분기를 결정함
동적 해싱 동적 해싱 (Dynamic Hashing) (3/8)(Dynamic Hashing) (3/8)
Advanced Data Structuresby Yang-Sae Moon
Page 48
Hash Structures
동적 해싱 파일의 삽입 예• 버킷 분할 : 분할되는 버킷이 레벨 I이면 , B(key) 의 I+1 번째 비트를 사용
- 0: 왼쪽 ( 이전 ) 버킷
- 1: 오른쪽 ( 신규 ) 버킷
동적 해싱 동적 해싱 (Dynamic Hashing) (4/8)(Dynamic Hashing) (4/8)
key H0(key) B(key)
157 2 10100 …
95 1 00011 …
88 1 01100 …
205 2 10010 …
13 1 10111 …
125 1 10001 …
6 1 01000 …
301 1 00110 …
H0 와 B 에 대한 예
Advanced Data Structuresby Yang-Sae Moon
Page 49
Hash Structures
동적 해싱 파일의 삽입 예 ( 계속 )
• 레코드 157, 95, 88, 205, 13 을 삽입 후의 초기 파일
동적 해싱 동적 해싱 (Dynamic Hashing) (5/8)(Dynamic Hashing) (5/8)
Advanced Data Structuresby Yang-Sae Moon
Page 50
Hash Structures
동적 해싱 파일의 삽입 예 ( 계속 )
• 레코드 125 를 추가로 삽입하여 버킷이 분할된 후의 파일
동적 해싱 동적 해싱 (Dynamic Hashing) (6/8)(Dynamic Hashing) (6/8)
Advanced Data Structuresby Yang-Sae Moon
Page 51
Hash Structures
동적 해싱 파일의 삽입 예 ( 계속 )
• 레코드 301, 6 을 추가로 삽입한 후의 파일
동적 해싱 동적 해싱 (Dynamic Hashing) (7/8)(Dynamic Hashing) (7/8)
Advanced Data Structuresby Yang-Sae Moon
Page 52
Hash Structures
동적 해싱의 고려사항• 함수 B 의 설계
- 레코드의 키 ( 또는 키에 대한 어떤 함수 H1) 를 유사 난수 생성기 (pseudo random number
generator) 의 초기 값으로 사용하여 정수를 생성 ( 예 : rand(srand(key));)
- 생성된 각 정수를 하나의 비트로 변환 ( 예 : 정수의 이진 표현에 대한 패리티 비트를 사용 )
• 인덱스 노드들이 메인 메모리에 광범위하게 분산되는 경우→ 트리 순회 과정에서 Page Fault 발생으로 추가적인 디스크 액세스 발생 가능성 있음
• 인덱스 Forest 가 커져서 하위 레벨 인덱스가 디스크에 저장되어야 하는 경우→ 레코드 접근 시간이 오히려 증가할 수 있음
• 개선책 : 오버플로우 버킷을 두어 버킷 분할 지연 ( 저장 공간 효율 ↑ )
동적 해싱 동적 해싱 (Dynamic Hashing) (8/8)(Dynamic Hashing) (8/8)
Advanced Data Structuresby Yang-Sae Moon
Page 53
Hash Structures
디렉토리와 버킷의 두 단계를 가지며 , 디렉토리는 2n 으로 증가하는 반면에 버킷은 선형적으로 증가함
두 단계 구성• 디렉토리 ( 인덱스에 해당 ): 전역 깊이 (global depth)(=d) 와 버킷에 대한 2d 개의
엔트리 (= < 해쉬 값 , 포인터 >) 로 구성되며 , 각 포인터가 반드시 상이해야 하는 것은 아님
• 버킷의 집합 ( 레코드 저장 ): 레코드들이 저장되는 공간으로서 , 지역 깊이 (local depth)(=p) 로 구성됨
• 깊이를 나타내는 d 와 p 에 대해서는 뒤쪽 슬라이드의 예제를 참조할 것
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (1/7)(1/7)
Directory
key 1
key 2
key 3
…
key 2n-1
key 2n
2n
…
…
…
Set of buckets
Advanced Data Structuresby Yang-Sae Moon
Page 54
Hash Structures
확장 해싱 함수 (Extendible Hashing Function)
• h: 키 유사키 (pseudo key, 고정 길이의 Bit String)
예 ) h(white) = 1001011011001110
• 버킷 깊이 : 버킷 안의 각 레코드들의 유사키가 공통으로 가지는 처음 Bit String 길이
초기 파일• N 개의 버킷일 때 ,
• d = log2(N-1) + 1, 디렉토리는 2d 개의 엔트리를 가짐
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (2/7)(2/7)
Advanced Data Structuresby Yang-Sae Moon
Page 55
Hash Structures
확장 해싱 파일에서의 삽입 연산
• 유사키의 처음 d 비트를 이용하여 디렉토리 액세스하고 , 해당 버킷을 찾아 삽입
• 만약 , 해당 버킷이 만원이면 ,
① 새로운 단말 ( 버킷 ) 을 할당
② 버킷 깊이가 p 이면 , 유사키의 (p+1) 번째 비트의 값에 따라 C+1 개의 레코드를 분할
③ d, p+1 의 값에 따라
- d ≥ p+1 ( 디렉토리 깊이가 분할된 버킷의 깊이를 수용하는 경우 ): 포인터들을 분할 , 이전의 버킷과 새로운 버킷 모두 p+1 의 버킷 깊이를 가짐
- d < p+1 ( 디렉토리 깊이가 분할된 버킷의 깊이를 수용치 못하는 경우 ): 디렉터리의 크기를 두 배로 늘림 (directory doubling), d←d+1
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (3/7)(3/7)
Advanced Data Structuresby Yang-Sae Moon
Page 56
Hash Structures
확장 해싱 파일의 예
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (4/7)(4/7)
레코드의 유사키가시작하고 있는 Bit String
Advanced Data Structuresby Yang-Sae Moon
Page 57
Hash Structures
d p+1: 버킷만 분할
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (5/7)(5/7)
레코드의 유사키가시작하고 있는 Bit String
Advanced Data Structuresby Yang-Sae Moon
Page 58
Hash Structures
d < p+1: 버킷 분할 및 디렉토리 확장
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (6/7)(6/7)
레코드의 유사키가시작하고 있는 Bit String
Advanced Data Structuresby Yang-Sae Moon
Page 59
Hash Structures
확장 해싱 파일에서의 검색 연산
• 유사 키의 처음 d 비트를 디렉토리에 대한 인덱스로 사용하여 디렉토리에서 찾아 레코드를 접근
• 디렉토리 검색 (Binary Search) 후 , 버킷 내에서 순차 검색
확장 해싱 파일에서의 삭제 연산
• 삭제될 버킷이 버디 버킷 (buddy bucket) 을 가지고 있고 , 그 두 버킷의 레코드들이 한 버킷 안에 들어갈 수 있다면 ,
• 하나의 버킷으로 병합한 후 , 빈 버킷을 회수하고 , 디렉토리 엔트리를 재조정함
• 버디 버킷 (buddy bucket): 해당 버킷과 같은 깊이 값 (p) 을 가지고 있고 , 그 유사키들의 처음 (p- 1) 비트들이 모두 같은 버킷 ( 분할되기 이전에 한 버킷에 속했던 버킷 )
확장 해싱 확장 해싱 (Extendible Hashing) (Extendible Hashing) (7/7)(7/7)
Advanced Data Structuresby Yang-Sae Moon
Page 60
Hash Structures
디렉토리를 사용하지 않는 확장성 해싱 방식
주소 공간이 확장될 때 , 해시 값을 비트 (bits) 를 사용
• 예 : 주소 공간이 4인 경우 , 2 비트 주소를 생성하는 해싱 함수를 이용
• 주소 공간이 4개의 버킷으로 구성된 것이지 4개의 디렉토리 노드가 버킷을 가리키는 것이 아님에 주의
• Why “linear”?: Overflow 가 일어날 경우 , 버킷 개수가 linear 하게 ( 하나씩 ) 증가됨
선형 해싱 선형 해싱 (Linear Hashing)(Linear Hashing)
Advanced Data Structuresby Yang-Sae Moon
Page 61
Hash Structures
초기 상태
삽입 과정 중 버킷 b 에 오버플로우 발생
• 첫 버킷인 버킷 a 를 분할 , 새 버킷 A 를 할당
• 오버플로우 레코드들은 오버플로우 체인 w 를 할당 받아 저장( 레코드 분산을 연기하는 개념임 )
• 버킷 a 와 새 버킷 A 의 주소는 3 비트로 변경
선형 해싱의 예 선형 해싱의 예 (1/3)(1/3)
Advanced Data Structuresby Yang-Sae Moon
Page 62
Hash Structures
버킷 d 에 오버플로우 발생
• 두 번째 버킷인 b 를 분할 , 새 버킷 B 를 할당
• 오버플로우 버킷 x 생성
버킷 x 에 오버플로우 발생
• 세 번째 버킷인 버킷 c 를 분할 , 새 버킷 C 를 할당
• 오버플로우 버킷 y 생성
선형 해싱의 예 선형 해싱의 예 (2/3)(2/3)
Advanced Data Structuresby Yang-Sae Moon
Page 63
Hash Structures
버킷 B 에 오버플로우 발생
• 네 번째 버킷인 버킷 d 를 분할 , 새 버킷 D 를 할당
• 오버플로우 버킷 z 생성
• 다음에 분할될 버킷을 가리키는 포인터는 다시 버킷 a 를 가리킴
• 모든 버킷이 3비트 해싱 함수를 사용하게 됨( 새로운 버킷을 생성하여 접근하기 위해서는 4- 비트 해싱 함술 h4() 를 이용하는
새로운 사이클에 들어갈 준비가 된 것임
선형 해싱의 예 선형 해싱의 예 (3/3)(3/3)
Advanced Data Structuresby Yang-Sae Moon
Page 64
Hash Structures
두 개의 해싱 함수 사용
• 현재 주소 길이를 가진 버킷에 대해서는 hd(k) 사용
• 확장 버킷에 대해서는 hd+1(k) 를 사용
→ 레코드의 검색을 위해 해당 레코드에 어떤 해싱 함수를 적용해야 하는지를 알아야 함
키 값 k 를 가지는 레코드를 포함하는 버킷의 주소 (address) 를 찾기 위한 프로시저
if (hd+1(k) p)
address = hd(k);
else
address = hd+1(k);
선형 해싱에서의 검색선형 해싱에서의 검색
p = 다음 분할될 버킷을 가리키는 포인터
Advanced Data Structuresby Yang-Sae Moon
Page 65
Hash Structures
액세스하고 유지해야 될 디렉토리가 없음
오버플로우 체인은 ( 실제로 ) 많이 길어지지 않음
• 오버플로우가 일어날 때마다 분할을 통해 주소 공간을 점차 확장하기 때문
버킷 크기를 50 이라 할 때 , 한번 검색 연산에 필요한 평균 디스크 접근 수는 거의 1 로 밝혀짐 ( 실험 결과 )
저장 공간 활용도는 확장 해싱이나 동적 해싱 보다는 낮음 ( 평균 60%)
선형 해싱의 특징선형 해싱의 특징