개념정리/화일처리및응용

화일처리 및 응용 공부 #19 (직접화일2)

한반가 2021. 6. 23. 13:30

2021.06.20 - [이론공부/화일처리및응용] - 화일 처리 및 응용 공부 #18 (직접 화일)\


테이블 이용 해싱

  • 저장장치에 한번의 접근으로 레코드 검색을 보장
    • 레코드 삽입 시간은 많이 걸리지만 검색은 매우 빠름
    • 해싱 함수는 각 레코드에 대해 일련의 <버킷주소i, k-비트 시그니처> 쌍을 생성 (i = 1, 2, 3 ....)
      - <addr1, sign1>, <addr2, sign2>, ....
    • 각 버킷에는 하나의 엔트리(k-비트 시그니처)로 구성된 버킷 테이블 유지
    • 화일 접근 시에 이 버킷 테이블은 전부 메인 메모리에 상주

테이블 이용 해싱 <85 - 00101> , <87 - 01001>

  • 레코드 삽입 예
    • 버킷 크기 :3
    • 레코드 삽입 순서 : white, blue, lilac, red, green ....
    • 각 레코드의 홈 버킷 : 85
  • 3번째 lilac을 삽입하면 버킷 85는 만원이 됨
    • 버킷 크기가 3이기 떄문
  • 4번쨰 red를 삽입할 때 오버플로 발생, 이 버킷 85에 대한 4레코드 시그니처 값들을 정렬
    • red (시그니처 00010 = 2)
    • white (시그니처 00101 =5)
    • blue (시그니처 00110 = 6)
    • lilac (시그니처 01000 =8) -> 분리 시그니처 값
  • 시그니쳐 값 8을 분리 시그니처 값으로 선정하고 버킷 85에 대한 버킷 테이블 엔트리로 저장
    • 버킷에는 항상 분리 시그니처 값보다 작은 레코드만 저장
  • 이 분리 시그니처 값보다 작은 red, white, blue 는 버킷 85에 다시 저장
  • 그러나 lilac은 그의 두번째 버킷주소 90에 저장
  • 버킷 테이블 엔트리 즉, 시그니처 값은 초기치 11111에서 버킷 오버플로 되는 경우에만 갱신
    -예 : white, blue, lilac, red, green을 삽입한경우
       - red, white, blue는 버킷 85에 저장 : 테이블 엔트리는 01000
       - lilac은 버킷 90에 저장 : 테이블 엔트리는 그대로 11111
  • green을 삽입 하면
    • green의 홈 버킷은 85, 시그니처는 3 (00011)
    • 버킷 85는 만원이기 때문에 시그니처 정렬을 통해 green은 버킷 85에 삽입
    • 오버플로된 blue는 재 삽입 리스트에 첨가시켜 대기
    • 버킷 85에 대한 테이블 엔트리는 8(01000)에서 6(00110)으로 갱신

테이블 이용 해싱을 통한 검색

  • 검색이 아주 빠르기 때문에 log-in용 id를 확인하는 화일 조직에 효율적임
    • 검색 시 해싱 함수는 검색할 레코드 키로부터 일련의 <버킷 주소i, 시그지처i>을 생성
  • 다음 조건을 만족하는 가장 i를 선정
    • 시그니처i < 버킷 i의 테이블 엔트리
      - 버킷 i에서 레코드 검색
  • 예 : white 검색시, 해싱 함수가 생성한 <버킷주소, 시그니처>를 테이블 엔트리와 검사해서 검색할 버킷 주소를 결정
    - 해싱함수 : <85, 00101>, <87, 01001>, <89, 10100>....
    - 시그니처 (85, 00101) < 버킷 85의 테이블 엔트리 (01000)
    - 따라서 검색할 버킷 주소는 85

 

확장성 직접 화일

  • 화일 레코드 수의 변화가  큰경우에 대한 해결방안

  • k : 어느 한 시점에서 화일에 저장된 레코드 수
  • Kmin ≤ K ≤ Kmax
  • Span = Kmax/Kmin
    • SPAN이 클때 문제가 됨
  • 화일 크기가 고정되어 있을때
  • K ~ Kmin :공간 이용률 낮음
  • K ~ Kmax : 적재 밀도가 높음
    • 저장과 검색 시간이 길어짐
    • 해결 방안은 재 해싱
      • 많은  시간 소요
      • 재 해싱 동안 접근 제한
  • 확장성 파일
    • 높은 SPAN 값을 가진 화일에 대한 해싱기법
    • 버킷 크기는 일정
    • 버킷 수는 가변
    • 오버플로 버킷은 사용안함
    • 삭제 간단
    • 검색은 1-2회 접근만 필요
  • 확장성 화일 유형
    • 가상 해싱
    • 동적 해싱
    • 확장성 해싱
    • 선형 해싱

 

가상 해싱

  • 여러 개의 해싱 함수 이용
  • 해싱 함수는 재산 잔여 기법을 기초
    h0 : 주소 = 키 mod N (N: 버킷의 수, C: 버킷 크기)
  • 오버플로우 시
    • 버킷의 C레코드와 삽입 하려는 레코드를 합한 C+1개의 레코드를 새로운 해싱 함수를 사용하여 재 해싱
    • 재해싱 함수 hi
      -hi : 주소 = 키 mod(2i *N), i = 0, 1, 2
      -h1 :주소 = 키 mod 2N
      -h2 :주소 = 키 mod 4N

예시1
예시2

트리의 표현

배열로 트리 표현 하는 방법

 

동적해싱

  • 화일 구성
    • 크기가 C인 N개의 버킷과 각 버킷을 지시하는 인덱스로 구성
      - 버킷은 저장 장치에 할당되고 인덱스는 메인메모리에 상주
  • 예) N = 20 이고 C = 3일때 초기 동적 해시 화일
    - 초기에 인덱스는 하나의 레벨 (레벨 0)

 

동적 해시 화일에서 레코드 삽입

  • 해시 함수(H0)로 레코드 저장할 버킷을 결정
    • 해싱 함수 H0는 키 값을 레벨 0의 인덱스N 으로 변환
    • 레코드를 저장할 버킷은 이 인덱스 엔트리로 접근
    • 버킷이 만원이 아니면 레코드를 저장하고 만원이면 버킷을 분할하고 C+1레코드를 나누어 분산 저장
    • 이때 이 인덱스 노드는 다음 하위 레벨의 두인덱스를 위해 왼쪽(old) 오른쪽(new) 서브트리를 갖는 이진트리가 됨
  • 버킷 분할과 레코드 분산 방법
    • 분산 저장해야될 레코드의 버킷이 왼쪽인지 오른쪽인지는 비트 함수 B로 결정
      - 비트함수 B : 키 값을 임의의 길이 비트 스트링으로 변환
    • 인덱스가 분기되는 레벨이 i 이면 비트스트링 i+1째 비트를 이용하여 이 비트가 0 이면 왼쪽 1이면 오른쪽으로 분기

 

동적 해시 화일에서의 검색

 

 

 

확장성 해싱

  • 확장성 해싱 함수 h 는 키값을 일정 길이의 비트 스트링, 모조키로 변환
    - ex) h(k) -> 10100001001
  • 확장성 해싱 화일은 디렉토리와 버킷으로 구성
    • 디렉토리
      • 일반적인 인덱스에 해당
      • 버킷에 대한 2^d개의 포인터로 구성
      • 정수 d는 전역 깊이(global depth)로 디렉토리의 크기를 나타낸다
      • 포인터들은 버킷을 가리킬 수도 있다
    • 버킷
      • 레코드들을 실제로 저장하는 공간
      • 각 버킷은 지역 깊이(local depth), p로 표시
        • 버킷 깊이 p 는 버킷에 저장된 모든 레코드들의 모조키들이 가지고 있는 비트스트링의 길이를 뜻한다

 

확장성 해싱 화일

강의 자료에서 설명된 확장성 해싱화일 구조

 

확장성 해싱 화일에서 검색

 

d ≥ (p+1)인 경우의 예

 

 

 

선형해싱