hashing 이란?

해시법은 지금까지 설명한 방법과는 전혀 다른 아이디어로 배열을 검색하는 알고리즘으로 잘 실현하면 평균 O(1)의 복잡도(한방에)로 탐색과 삽입 및 삭제를 할 수 있다.

비교에 의해서 검색하는 방법이 아니라 함수식을 이용하여 바로 찾아 가는 검색방법을 말한다.

해시 함수가 2*x + 3 이라면 찾고자 하는 데이터 x 가 3 이라면 2*3+3 즉 9 가 이 데이터의 주소이므로 9 위치를 찾아 가는 방법을 말한다.

hashing 의 용어정리
(보기)다음과 같은 해시 함수(hashing function)를 이용하여 용의를 정의하도록 하자. 이 해시함수는 데이터를 10 으로 나눈 나머지 값으로 주소를 정의한다.
hf(data)=data % 10
아래와 같은 해시 테이블이 준비되어 있다고 하자.이 해시 테이블은 20 개의 데이터를 담을 수 있는 테이블이다.

이 테이블에는 10 개의 버킷이 존재하고 , 각 버킷에는 2 개의 데이터를 담을 수 있다. 한 버킷에 담을 수 있는 데이터 수 2 를 슬롯(slot) 이하 한다. 슬롯의 크기는 2 이다.

(풀이)데이터 18 이 온다면 ,

데이터 26,77,192 순으로 입력된다면,

데이터 128 이 입력될 때 , hf(18)=hf(128) 이 된다. 이 때 충돌(collision)이 발생했다고 하고 , 충돌을 발생시키는 18 , 128 을 동의어(synonym)이라 한다. 슬롯이 하나 남아 있으므로 128 을 다른 슬롯에 넣는다.

데이터 38 이 입력된다면 다시 충돌이 발생되고 , 이제 더 이상 빈 슬롯이 없다. 이를 오버플로(overflow)가 발생햇다고 한다.

해쉬 주소공간에서 한 기억장소부근에 키기 소복히 모이는 현상을 cluster 가 발생한다고 한다. 이 cluster 발생은 해쉬에서 매우 해로운 현상이다.그래서 해쉬함수를 정할 때 가능한 cluster 를 발행하지 않는 해쉬함수를 정하는 게 중요하다.###

해시를 구현히 고려해야 할 두 가지 사항은

  1. 어떤 해시 함수를 정할 것인가?
  2. overflow 발생시 어떻게 해결할 것인가?
해시함수를 정할 시 클러스트를 발생시키지 않기위해 해시함수를 너무 복잡하게 만들어 해시의 장점인 속도가 줄어드는 즉 벼룩을 잡기위해 초가삼간을 태우는 우를 범하지 말아야 한다. 해쉬함수를 정할시 가능한 간단하고 , 클러스트현상을 발생시키지 않는 것이 중요하다.

해쉬함수로 많이 사용되는 방법으로는

오버플로의 해결방법으로는

사실상 오버플로의 발생을 완전하게 없애는 것은 불가능하므로 오버플로가 발생했을 시 이를 해결하는 방법이 있어야 한다.

  1. open addressing ; 오버플로가 발생했을시 가능한 인접한 위치에
  2. closed addresing : 링크트리스로 해결하는 방안
overflow 처리방법
  1. rehasing" hf(key) -> address 다시 hf() 로
  2. open addressing: 인접한 빈 slot 에 -- cluster 발생 우려
    linear 하나씩 증가
    quadratic: 자승시켜주면서 채워줌 -> 가능한 cluster 발생방지 위애 소수단위로 자승 시켜주은 것이 이상적
  3. chainnig : linked list 이용
    direct : hashing table 내로
    indirect : hashing table 밖으로
출처:dovelet

[질/답]
[홈으로]  [뒤 로]
[푼 후(0)]