   2012. 01. 02(월)

   발 표 자 : 쥬신 5기 김 경 균
1.   해시 테이블( Hash Table )과 해싱( Hashing ) 이란?
2.   해시 함수란?
3.   해싱의 구조.
4.   해시 테이블의 구조.
5.   해시 함수의 종류.
6.   오버플로우(Overflow) 해결 방법.
 해시 테이블 (Hash Table) 은 데이터의 해시 값을 테이블 내
의 주소로 이용하는 궁극의 탐색 알고리즘이다.

 해싱(Hashing)은 하나의 문자열을 원래의 것을 상징하는 더
짧은 길이의 값이나 키로 변환하는 것이다.
   해싱 알고리즘을 해시 함수라고 부른다.

 해싱 함수 h(k)는 어떤 키 k에 대한 테이블 주소를 계산하기 위한 방법으
로 주어진 키 값으로부터 레코드가 저장되어 있는 주소를 산출해 낼 수 있는
수식을 의미한다.

   충돌 위험성이 매우 적은 해시 함수라야 훌륭한 해시 함수로 평가된다.

 암호화에 사용되는 잘 알려진 해시 함수들이 몇 개 있다. 이러한 것들에
는 전자서명을 요약 메시지라고 불리는 더 짧은 값으로 바꾸는 데 사용되는
요약 메시지 해시 함수 MD2, MD4, MD5 등과, 더 큰 요약 메시지 (60 비트)
를 만드는 표준 알고리즘인 SHA (Secure Hash Algorithm) 등이 포함된다.
 짧은 해시 키를 사용하여 항목을 찾으면 원래의 값을 이용하
여 찾는 것보다 더 빠르기 때문에, 해싱은 데이터베이스 내의 항
목들을 색인하고 검색하는데 사용된다.

 데이터베이스 검색 수법은 일치하는 것이 먼저 발견될 때까
지 각 이름들을 글자단위로 확인하기 시작해야만 한다. 그러나,
만약 이름들 각각이 해시된다면, 각 이름별로 4자리의 고유한 키
를 생성하는 것이 가능해진다.

 어떤 이름을 찾는 작업은 먼저 해시 값을 계산하고, 그 다음
에 그 값을 사용하여 일치여부를 비교하는 작업으로 구성된다.
•   사전 구조
     - 맵(map)이나 테이블(table)로 불리우기도 한다.
       사전 구조는 다음과 같이 탐색키와 탐색키와 관련된 값의
       2가지 종류의 필드를 가진다.

Ex)
   - 단어의 정의나 주소 또는 전화 번호같은 탐색키와 관련된
값(value)
해시 함수(Hash Function)란 탐색키를 입력으로 받아 해시
주소(Hash Address)를 생성하고 이 해시 주소가 배열로 구현된
해시 테이블(Hash Table)의 인덱스가 된다.

Ex)
  - 영어 사전에서는 단어가 탐색키가 되고 이 단어를 해싱 함
수를 이용하여 적절한 정수 i로 변환한 다음, 배열 요소 ht[i]에
단어의 정의를 저장하는 것이다.
 가장 이상적인 해싱 함수는 키 집합의 한 레코드(record)와 버
켓 주소 집합의 한 레코드가 1 : 1 대응하여 해시 테이블의 정해진
범위에 고르게 분포되어 있어서 충돌을 최소화 하도록 하는 것인데
다음의 조건을 만족해야 한다.

     주소 계산이 빠르게 구해져야 한다.
     서로 다른 레코드의 계산된 값이 가급적 중복되지 않아야
    한다.
     충돌이 적어야 한다.
  해시테이블 ht는 M개의 버켓(bucket)으로 이루어지는 테이블로서 ht[0],
ht[1], ...,ht[M-1]의 원소를 가진다.

   하나의 버켓은 s개의 슬롯(slot)을 가질 수 있다.

   충돌(Collision)
     • 서로 다른 두개의 탐색키 k1과 k2에 대하여
     • h(k1) = h(k2)인 경우에는 충돌이 일어난다.


 이러한 충돌이 버켓이 할당된 슬롯 수보다 많이 발생하게 되면 버켓에
더 이상 항목을 저장할 수 없게 되는 오버플로우(Overflow)가 발생한다.

   오버플로우를 해결하기 위한 방법이 반드시 필요하다.
 제산법
   - 나머지 연산자(%)를 사용하여 테이블 주소를 계산하는 방법으로, 레
코드 키 값을 수치 자료로 간주하여 어떤 양의 정수(대개 해시 테이블의 크
기)로 나눈 나머지를 홈 주소로 결정하는 가장 간단한 해싱 함수이다.

    - 버킷주소 = 키 값 % 해쉬 테이블의 크기

    Ex)   12   = 512 % 100

문제점
  - 해시 주소가 고르게 분포되지 않을 수 있다는 것이다. 만약 탐색 키가
대부분이 짝수이고 M도 짝수라면 해시 주소는 거의 다 짝수가 된다. 이렇게
되면 홀수 버켓에는 슬롯이 많이 남게 된다. 따라서 해쉬 테이블의 크기는
되도록이면 소수(약수가 1과 자기 자신밖에 없는 수)로 선택하는 것이 좋다.
 제곱법
   - 제곱법은 레코드 키 값을 제곱한 후에 결과 값의 중간 부분
에 있는 몇 비트를 선택하여 해시 테이블의 홈 주소로 사용한다.

  - 제곱된 결과의 중간 비트는 대개 레코드의 모든 문자에 의
존하므로, 레코드를 구성하는 몇 개의 문자가 같을 지라도 서로
다른 레코드 키는 다른 홈 주소를 갖게 될 확률이 높다.

   - 홈 주소를 얻기 위해 사용되는 비트 수는 테이블의 크기에
따라 달라지는데, 중간 부분의 자릿수를 n이라 하면 각 레코드
값들이 가지는 범위인 해시 테이블의 크기는 2n이 된다.
   제곱법

    - 키 값 제곱   해쉬 테이블 크기에 따라 주소 값 산출




Ex) 레코드 키 값이 K = 512이고, 해시 테이블의 크기가 100 일
때 제곱 법에 의한 레코드 주소는?

    -> 512 제곱 = 262144
        =>> 중간 2자리 “21” 최종 주소 값이 됨.
 숫자 분석법
   - 레코드 키를 구성하는 수들이 모든 키들 내에서 각 자리별
로 어떤 분포인지를 조사하여 비교적 고른 분포를 나타내는 자
릿수를 필요한 만큼 선택하여, 레코드의 홈 주소로 사용하는 방
법이다.

   - 파일의 레코드 키 값이 이미 알려진 정적 파일(static file)
인 경우에 유용하며, 삽입과 삭제가 빈번히 발생하는 경우에는
비효율적이다.
    숫자 분석법

     Ex) 해시 테이블의 크기=1000, 홈 주소 : 0 ~999까지(3자리 필요) 레코드
키 값이 다음의 (a)와 같을 때 숫자 분석법을 이용하여 각 키들에 대한 홈 주소를
결정하시오.




1.   (a)에서 왼쪽 3자리 숫자는 거의 같으므로 제거.
2.   왼쪽 5열, 6열, 7열, 9열 역시 동일 숫자가 많이 분포 하였으므로 무시.
3.   비교적 고른 숫자 분포를 가진 4열, 8열 10열을 선택하여 주소로 사용.
    폴딩 법

   - 폴딩법은 레코드의 키를 마지막 부분을 제외한 모든 부분
의 길이가 동일하게 여러 부분으로 나누고, 이들 부분을 모두 더
하거나 배타적 논리합(XOR)을 취하여, 해시 테이블의 홈 주소로
이용하는 방법으로 두 가지 방법이 사용된다.

1.   이동 폴딩(Shift Folding)

2.   경계 폴딩(Boundary Folding)
   이동 폴딩

   - 각 부분의 값을 계산하기 위해 마지막을 제외한 모든 부분
을 이동시켜 최하위 비트 (LSB)가 마지막 부분의 자리와 일치하
도록 우측 끝을 맞추어 더한 값을 홈 주소로 하는 방법이다.
   경계 폴딩

   - 원래의 레코드 키 값을 여러 부분으로 나눈 후, 나누어진
각 부분의 경계선을 종이 접듯이 접어 역으로 정렬한 다음 같은
자리에 위치한 수를 더한 값을 홈 주소로 하는 방법이다.
   기수변환 법

   - 기수 변환법은 어떤 진법으로 표현된 주어진 레코드 키를
다른 진법으로 간주하고 키를 변환하여 홈 주소를 얻는
방법으로, 어떤 키 값이 16진법으로 표현되어 있다면 이를
10진법으로 표현된 것으로 간주하고 키 값을 변환하여 해당
레코드의 홈 주소를 구한다.

  - 해시 테이블의 크기가 10의 멱승으로 표현되어 변환된
해당 레코드의 주소 값이 테이블의 크기를 초과할 때는 주소
값의 최하위 자리부터 해시 테이블의 크기가 허용하는 멱승수
만큼 취하여 해당 레코드의 홈 주소로 사용한다.
   기수변환 법

    - Ex) 해시 테이블의 크기 = 10000(104)

  - 십진수로 입력된 키 값(B2538)10을 16진수로 간주하여 그 값을
다시 10진수로 계산하는 기수 변환법을 이용하여 홈 주소를 구하시오.

(풀이) (1 * 165) + (3 * 164) + (2 * 163) + (5 *162 ) + (4 * 161) + (8 * 160)
   = 1048576 + 196608 + 8192 + 1280 + 64 + 8
   = (1254728)10
    홈 주소 = 4728

  - 레코드의 주소값(1254728)10에서 해시 테이블이 허용하는 하위
4자리를 선택한다.
   무작위 방법

  - 무작위 방법은 난수 발생 프로그램을 이용하여
난수(random number)를 발생시켜 각 레코드 키의 홈 주소를
결정하는 방법으로, 보통 난수는 1보다 작은 양의 실수를
산출하므로,

     - 해시 테이블의 크기인 n을 산출된 난수에 곱하여
0 ~ (n-1)까지의 범위 값으로 변환하여 사용하며, 만일 충돌이
발생하게 되면 그 다음 난수를 레코드의 홈 주소로 사용한다.
   무작위 방법

    - Ex) 키값이 12345 일 때, 해시테이블 크기는 1000,
          생성된 난수는 6, 7 이다. 홈 주소는?

      (6 * 12345 + 7) mod 1000 = 77
       ↑     ↑      ↑       ↑
      난수 키값        난수  해시테이블크기
 서로 다른 레코드 키가 동일한 홈 주소를 갖는 충돌(collision) 현상이
발생했다는 것은 특정 레코드의 키 값인 K의 해싱 함수값h(K)의 해시 테이
블 주소에는 이미 다른 레코드 키가 보관되어 있다는 것을 의미하므로, 버
켓의 크기가 1인 경우 충돌을 유발한 레코드 키 K를 저장하기 위해 다른 기
억 장소를 검색해야 한다.

이와 같이 다른 기억 장소를 찾아 충돌을 유발한 레코드를      저장하는
일을 과잉 상태 처리라 한다.

1.   선형 검색법
2.   2차 검색법
3.   무작위 검색법
4.   체인이용법
 선형 검색법
   - 선형 검색법은 충돌을 해결하는 가장 간단한 방법으로, 충
돌 발생시 새로운 레코드 키를 저장할 기억 공간을 찾기 위해 충
돌이 일어난 그 위치에서 테이블 순으로 차례대로 하나씩 검색
하여 첫번째 빈 영역에 레코드 키를 저장하여 충돌을 해결하는
방법이다.

    - 충돌을 일으킨 레코드 키 K를 저장할 후속 주소 h1(K) =
h0(K) + 1이 되고, h1(K)에 새로운 레코드의 저장이 가능한지 확
인하여 빈곳이면 그곳에 레코드를 저장하고, 그렇지 않으면 빈
곳을 찾을 때까지 다음 후속 주소를 따라 검색을 계속한다.
   선형 검색법

   - 만약 테이블의 끝에 도달하게 되면 다시 테이블의 처음으
로 간다.
   - 만약 조사를 시작했던 곳으로 되돌아오게 되면 테이블이
가득 찬 것이 된다.

    - hi(k) = h0(k) + i

 장 점 : 구조가 간단하다.
 단 점 : 최악의 경우 해시 테이블 전체를 검색해야 하는 상황
이 발생 할 수 있으므로 비효율 적이다.
   2차 검색법

    - 2차 검색법은 선형 검색법에서 발생하는 제 1밀집(primary
clustering) 문제를 제거하는 방법으로, 기대되는 충돌 함수는 이
차식인 f(i)= i2이 된다.

     - 원래의 테이블 주소로부터 다음 주소를 결정하는 거리 d가
1, 4, 9, 16, …과 같이 떨어진 영역을 차례대로 검색하여 처음으
로 발견되는 빈 영역에 해당 레코드를 저장함으로써 충돌을 해
결하는 방법이다.

    - hi(k) = (h0(k) + i^2) % n
   무작위 검색법

   - 충돌을 유발한 레코드 키를 저장할 수 있는 가용공간을 찾
을 때까지 난수 계산 프로그램을 실행하여 해시 테이블의 홈
주소를 다음 후속 주소로 택하여 충돌을 해결하는 방법이다.

   - 해시 테이블의 크기 = n , i번째 발생한 난수를 ri라고 할
때 i번째 후속 주소 hi(k) 는 아래 공식과 같다.

    - hi(K) = (h0(K) + ri) mod n
   체인 이용법

   - 해시 함수에 의해 같은 기억공간에 할당되어 충돌이 발생
한 레코드들을 연결 리스트 (Linked List)로 연결하는 방법으로
해시 테이블 자체는 포인터의 배열로 만들고, 같은 버켓에 할당
되는 레코드들을 체인으로 만들어 연결한다.
   체인 이용법

  - 해시 연쇄법은 연결 리스트를 사용하므로 해시 테이블에서의 삽
입이나 삭제 연산이 용이하며, 충돌의 횟수를 감소시키지는 못하지만,
다른 충돌 해결 방법에 의해 해시 테이블을 검색할 때 발생하는 소요시
간을 감소시킬 수 있다.

장 점:
  - 충돌이 발생한 명칭들만 연결 리스트에서 검색해 주면 되므로 속
도가 빠르다.
  - 삽입 가능한 명칭의 수가 해시 테이블 크기에 영향을 받지 않는다.

   단 점 : 구조가 복잡하고 기억 장소 소모량이 많다.
해     싱(Hashing)

해 싱(Hashing)

  • 1.
    2012. 01. 02(월)  발 표 자 : 쥬신 5기 김 경 균
  • 2.
    1. 해시 테이블( Hash Table )과 해싱( Hashing ) 이란? 2. 해시 함수란? 3. 해싱의 구조. 4. 해시 테이블의 구조. 5. 해시 함수의 종류. 6. 오버플로우(Overflow) 해결 방법.
  • 3.
     해시 테이블(Hash Table) 은 데이터의 해시 값을 테이블 내 의 주소로 이용하는 궁극의 탐색 알고리즘이다.  해싱(Hashing)은 하나의 문자열을 원래의 것을 상징하는 더 짧은 길이의 값이나 키로 변환하는 것이다.
  • 4.
    해싱 알고리즘을 해시 함수라고 부른다.  해싱 함수 h(k)는 어떤 키 k에 대한 테이블 주소를 계산하기 위한 방법으 로 주어진 키 값으로부터 레코드가 저장되어 있는 주소를 산출해 낼 수 있는 수식을 의미한다.  충돌 위험성이 매우 적은 해시 함수라야 훌륭한 해시 함수로 평가된다.  암호화에 사용되는 잘 알려진 해시 함수들이 몇 개 있다. 이러한 것들에 는 전자서명을 요약 메시지라고 불리는 더 짧은 값으로 바꾸는 데 사용되는 요약 메시지 해시 함수 MD2, MD4, MD5 등과, 더 큰 요약 메시지 (60 비트) 를 만드는 표준 알고리즘인 SHA (Secure Hash Algorithm) 등이 포함된다.
  • 5.
     짧은 해시키를 사용하여 항목을 찾으면 원래의 값을 이용하 여 찾는 것보다 더 빠르기 때문에, 해싱은 데이터베이스 내의 항 목들을 색인하고 검색하는데 사용된다.  데이터베이스 검색 수법은 일치하는 것이 먼저 발견될 때까 지 각 이름들을 글자단위로 확인하기 시작해야만 한다. 그러나, 만약 이름들 각각이 해시된다면, 각 이름별로 4자리의 고유한 키 를 생성하는 것이 가능해진다.  어떤 이름을 찾는 작업은 먼저 해시 값을 계산하고, 그 다음 에 그 값을 사용하여 일치여부를 비교하는 작업으로 구성된다.
  • 6.
    사전 구조 - 맵(map)이나 테이블(table)로 불리우기도 한다. 사전 구조는 다음과 같이 탐색키와 탐색키와 관련된 값의 2가지 종류의 필드를 가진다. Ex) - 단어의 정의나 주소 또는 전화 번호같은 탐색키와 관련된 값(value)
  • 7.
    해시 함수(Hash Function)란탐색키를 입력으로 받아 해시 주소(Hash Address)를 생성하고 이 해시 주소가 배열로 구현된 해시 테이블(Hash Table)의 인덱스가 된다. Ex) - 영어 사전에서는 단어가 탐색키가 되고 이 단어를 해싱 함 수를 이용하여 적절한 정수 i로 변환한 다음, 배열 요소 ht[i]에 단어의 정의를 저장하는 것이다.
  • 8.
     가장 이상적인해싱 함수는 키 집합의 한 레코드(record)와 버 켓 주소 집합의 한 레코드가 1 : 1 대응하여 해시 테이블의 정해진 범위에 고르게 분포되어 있어서 충돌을 최소화 하도록 하는 것인데 다음의 조건을 만족해야 한다.  주소 계산이 빠르게 구해져야 한다.  서로 다른 레코드의 계산된 값이 가급적 중복되지 않아야 한다.  충돌이 적어야 한다.
  • 10.
     해시테이블ht는 M개의 버켓(bucket)으로 이루어지는 테이블로서 ht[0], ht[1], ...,ht[M-1]의 원소를 가진다.  하나의 버켓은 s개의 슬롯(slot)을 가질 수 있다.  충돌(Collision) • 서로 다른 두개의 탐색키 k1과 k2에 대하여 • h(k1) = h(k2)인 경우에는 충돌이 일어난다.  이러한 충돌이 버켓이 할당된 슬롯 수보다 많이 발생하게 되면 버켓에 더 이상 항목을 저장할 수 없게 되는 오버플로우(Overflow)가 발생한다.  오버플로우를 해결하기 위한 방법이 반드시 필요하다.
  • 12.
     제산법 - 나머지 연산자(%)를 사용하여 테이블 주소를 계산하는 방법으로, 레 코드 키 값을 수치 자료로 간주하여 어떤 양의 정수(대개 해시 테이블의 크 기)로 나눈 나머지를 홈 주소로 결정하는 가장 간단한 해싱 함수이다. - 버킷주소 = 키 값 % 해쉬 테이블의 크기 Ex) 12 = 512 % 100 문제점 - 해시 주소가 고르게 분포되지 않을 수 있다는 것이다. 만약 탐색 키가 대부분이 짝수이고 M도 짝수라면 해시 주소는 거의 다 짝수가 된다. 이렇게 되면 홀수 버켓에는 슬롯이 많이 남게 된다. 따라서 해쉬 테이블의 크기는 되도록이면 소수(약수가 1과 자기 자신밖에 없는 수)로 선택하는 것이 좋다.
  • 13.
     제곱법 - 제곱법은 레코드 키 값을 제곱한 후에 결과 값의 중간 부분 에 있는 몇 비트를 선택하여 해시 테이블의 홈 주소로 사용한다. - 제곱된 결과의 중간 비트는 대개 레코드의 모든 문자에 의 존하므로, 레코드를 구성하는 몇 개의 문자가 같을 지라도 서로 다른 레코드 키는 다른 홈 주소를 갖게 될 확률이 높다. - 홈 주소를 얻기 위해 사용되는 비트 수는 테이블의 크기에 따라 달라지는데, 중간 부분의 자릿수를 n이라 하면 각 레코드 값들이 가지는 범위인 해시 테이블의 크기는 2n이 된다.
  • 14.
    제곱법 - 키 값 제곱 해쉬 테이블 크기에 따라 주소 값 산출 Ex) 레코드 키 값이 K = 512이고, 해시 테이블의 크기가 100 일 때 제곱 법에 의한 레코드 주소는? -> 512 제곱 = 262144 =>> 중간 2자리 “21” 최종 주소 값이 됨.
  • 15.
     숫자 분석법 - 레코드 키를 구성하는 수들이 모든 키들 내에서 각 자리별 로 어떤 분포인지를 조사하여 비교적 고른 분포를 나타내는 자 릿수를 필요한 만큼 선택하여, 레코드의 홈 주소로 사용하는 방 법이다. - 파일의 레코드 키 값이 이미 알려진 정적 파일(static file) 인 경우에 유용하며, 삽입과 삭제가 빈번히 발생하는 경우에는 비효율적이다.
  • 16.
    숫자 분석법 Ex) 해시 테이블의 크기=1000, 홈 주소 : 0 ~999까지(3자리 필요) 레코드 키 값이 다음의 (a)와 같을 때 숫자 분석법을 이용하여 각 키들에 대한 홈 주소를 결정하시오. 1. (a)에서 왼쪽 3자리 숫자는 거의 같으므로 제거. 2. 왼쪽 5열, 6열, 7열, 9열 역시 동일 숫자가 많이 분포 하였으므로 무시. 3. 비교적 고른 숫자 분포를 가진 4열, 8열 10열을 선택하여 주소로 사용.
  • 17.
    폴딩 법 - 폴딩법은 레코드의 키를 마지막 부분을 제외한 모든 부분 의 길이가 동일하게 여러 부분으로 나누고, 이들 부분을 모두 더 하거나 배타적 논리합(XOR)을 취하여, 해시 테이블의 홈 주소로 이용하는 방법으로 두 가지 방법이 사용된다. 1. 이동 폴딩(Shift Folding) 2. 경계 폴딩(Boundary Folding)
  • 18.
    이동 폴딩 - 각 부분의 값을 계산하기 위해 마지막을 제외한 모든 부분 을 이동시켜 최하위 비트 (LSB)가 마지막 부분의 자리와 일치하 도록 우측 끝을 맞추어 더한 값을 홈 주소로 하는 방법이다.
  • 19.
    경계 폴딩 - 원래의 레코드 키 값을 여러 부분으로 나눈 후, 나누어진 각 부분의 경계선을 종이 접듯이 접어 역으로 정렬한 다음 같은 자리에 위치한 수를 더한 값을 홈 주소로 하는 방법이다.
  • 20.
    기수변환 법 - 기수 변환법은 어떤 진법으로 표현된 주어진 레코드 키를 다른 진법으로 간주하고 키를 변환하여 홈 주소를 얻는 방법으로, 어떤 키 값이 16진법으로 표현되어 있다면 이를 10진법으로 표현된 것으로 간주하고 키 값을 변환하여 해당 레코드의 홈 주소를 구한다. - 해시 테이블의 크기가 10의 멱승으로 표현되어 변환된 해당 레코드의 주소 값이 테이블의 크기를 초과할 때는 주소 값의 최하위 자리부터 해시 테이블의 크기가 허용하는 멱승수 만큼 취하여 해당 레코드의 홈 주소로 사용한다.
  • 21.
    기수변환 법 - Ex) 해시 테이블의 크기 = 10000(104) - 십진수로 입력된 키 값(B2538)10을 16진수로 간주하여 그 값을 다시 10진수로 계산하는 기수 변환법을 이용하여 홈 주소를 구하시오. (풀이) (1 * 165) + (3 * 164) + (2 * 163) + (5 *162 ) + (4 * 161) + (8 * 160) = 1048576 + 196608 + 8192 + 1280 + 64 + 8 = (1254728)10 홈 주소 = 4728 - 레코드의 주소값(1254728)10에서 해시 테이블이 허용하는 하위 4자리를 선택한다.
  • 22.
    무작위 방법 - 무작위 방법은 난수 발생 프로그램을 이용하여 난수(random number)를 발생시켜 각 레코드 키의 홈 주소를 결정하는 방법으로, 보통 난수는 1보다 작은 양의 실수를 산출하므로, - 해시 테이블의 크기인 n을 산출된 난수에 곱하여 0 ~ (n-1)까지의 범위 값으로 변환하여 사용하며, 만일 충돌이 발생하게 되면 그 다음 난수를 레코드의 홈 주소로 사용한다.
  • 23.
    무작위 방법 - Ex) 키값이 12345 일 때, 해시테이블 크기는 1000, 생성된 난수는 6, 7 이다. 홈 주소는? (6 * 12345 + 7) mod 1000 = 77 ↑ ↑ ↑ ↑ 난수 키값 난수 해시테이블크기
  • 24.
     서로 다른레코드 키가 동일한 홈 주소를 갖는 충돌(collision) 현상이 발생했다는 것은 특정 레코드의 키 값인 K의 해싱 함수값h(K)의 해시 테이 블 주소에는 이미 다른 레코드 키가 보관되어 있다는 것을 의미하므로, 버 켓의 크기가 1인 경우 충돌을 유발한 레코드 키 K를 저장하기 위해 다른 기 억 장소를 검색해야 한다. 이와 같이 다른 기억 장소를 찾아 충돌을 유발한 레코드를 저장하는 일을 과잉 상태 처리라 한다. 1. 선형 검색법 2. 2차 검색법 3. 무작위 검색법 4. 체인이용법
  • 25.
     선형 검색법 - 선형 검색법은 충돌을 해결하는 가장 간단한 방법으로, 충 돌 발생시 새로운 레코드 키를 저장할 기억 공간을 찾기 위해 충 돌이 일어난 그 위치에서 테이블 순으로 차례대로 하나씩 검색 하여 첫번째 빈 영역에 레코드 키를 저장하여 충돌을 해결하는 방법이다. - 충돌을 일으킨 레코드 키 K를 저장할 후속 주소 h1(K) = h0(K) + 1이 되고, h1(K)에 새로운 레코드의 저장이 가능한지 확 인하여 빈곳이면 그곳에 레코드를 저장하고, 그렇지 않으면 빈 곳을 찾을 때까지 다음 후속 주소를 따라 검색을 계속한다.
  • 26.
    선형 검색법 - 만약 테이블의 끝에 도달하게 되면 다시 테이블의 처음으 로 간다. - 만약 조사를 시작했던 곳으로 되돌아오게 되면 테이블이 가득 찬 것이 된다. - hi(k) = h0(k) + i  장 점 : 구조가 간단하다.  단 점 : 최악의 경우 해시 테이블 전체를 검색해야 하는 상황 이 발생 할 수 있으므로 비효율 적이다.
  • 27.
    2차 검색법 - 2차 검색법은 선형 검색법에서 발생하는 제 1밀집(primary clustering) 문제를 제거하는 방법으로, 기대되는 충돌 함수는 이 차식인 f(i)= i2이 된다. - 원래의 테이블 주소로부터 다음 주소를 결정하는 거리 d가 1, 4, 9, 16, …과 같이 떨어진 영역을 차례대로 검색하여 처음으 로 발견되는 빈 영역에 해당 레코드를 저장함으로써 충돌을 해 결하는 방법이다. - hi(k) = (h0(k) + i^2) % n
  • 28.
    무작위 검색법 - 충돌을 유발한 레코드 키를 저장할 수 있는 가용공간을 찾 을 때까지 난수 계산 프로그램을 실행하여 해시 테이블의 홈 주소를 다음 후속 주소로 택하여 충돌을 해결하는 방법이다. - 해시 테이블의 크기 = n , i번째 발생한 난수를 ri라고 할 때 i번째 후속 주소 hi(k) 는 아래 공식과 같다. - hi(K) = (h0(K) + ri) mod n
  • 29.
    체인 이용법 - 해시 함수에 의해 같은 기억공간에 할당되어 충돌이 발생 한 레코드들을 연결 리스트 (Linked List)로 연결하는 방법으로 해시 테이블 자체는 포인터의 배열로 만들고, 같은 버켓에 할당 되는 레코드들을 체인으로 만들어 연결한다.
  • 30.
    체인 이용법 - 해시 연쇄법은 연결 리스트를 사용하므로 해시 테이블에서의 삽 입이나 삭제 연산이 용이하며, 충돌의 횟수를 감소시키지는 못하지만, 다른 충돌 해결 방법에 의해 해시 테이블을 검색할 때 발생하는 소요시 간을 감소시킬 수 있다. 장 점: - 충돌이 발생한 명칭들만 연결 리스트에서 검색해 주면 되므로 속 도가 빠르다. - 삽입 가능한 명칭의 수가 해시 테이블 크기에 영향을 받지 않는다.  단 점 : 구조가 복잡하고 기억 장소 소모량이 많다.