2-2공부/자료구조

기말준비-해싱(Hashing)

KGW2027 2021. 12. 9. 13:32
728x90
반응형

 기존 검색 시간은 O(lg N) 인데, 이것을 O(1)로 낮추기 위한 시도

   -> 배열의 크기, 데이터 량에 관계 없이 검색의 시간이 동일하게 함.

  방법  : 매우 큰 공간을 가진 Hash table를 만든다. 이때 hash table의 사이즈 M은 소수이다. (Prime number)

  공간낭비가 커 효율이 떨어지지만 긴급한 검색의 경우 필요해 만들어짐.

 

 1. 배경

   data K가 저장될 위치를 data K를 통해 구하는 방식

  h(K) : Hash function, Table[h(k)] = k로 저장

 

 2. 문제점

  2-1) 충돌 (Collision)

   서로 다른 데이터 X, Y에서, h(X) == h(Y)가 돼버리는 경우  ( 서로 다른 데이터가 같은 해시를 지님 )

  2-2) 군집화 (Clustering)

   데이터가 해시 테이블에 골고루 분산되지 않고 부분적으로 뭉치게 되는 현상

 

 3. 해시 펑션 (Hash Function)

  문제점 2개를 최대한 해결할 수 있는 해시 펑션을 만들어야함.

  일반형 : h(x) = f(x)mod M

   - f(x)는 데이터 X를 임의 가공하여 정수로 변환시키는 함수 (Universal Hashing, etc.)

   - mod M은 f(x)를 M으로 나눈 나머지값을 구함.

 

4. 충돌 해결법

 데이터 K를 저장하려는 위치 h(K)에 이미 다른 데이터가 저장되어 있는 경우

 4-1) 선형 조사법 (Linear probing)

  h(K)에 1씩 더하면서 비어있는 공간을 찾으면 입력한다.

  (h(K)+1) > M이 될 수 있으므로, (h(K)+1)mod M의 형태로 사용함.

   장점 : 매우 간단함

   단점 : 잦은 충돌 시 군집화 될 가능성이 높음, 

           연속적으로 저장된 data가 일부 삭제될 시 그 밑의 데이터는 검색되지 않음.

            -> 각 항목이 (사용), (미사용), (삭제됨) 으로 구분되면 검색 가능

 

4-2) 2차 조사법 (Quadratic Probing)

 (h(K)+(i^2))mod M의 형태로 i를 늘려가며 빈 공간을 찾아서 입력한다.

 장점 : 1차 군집화는 감소한다.

 단점 : 2차 군집화의 가능성이 있다. -> i를 늘리는 방식의 변화는 군집화 해결에 큰 의미 없음.

 

4-3) Double Hashing

 2차 군집화의 감소를 위해, size M보다 약간 작은 소수 C를 이용한 g(x)를 추가로 사용한다.

  -> ( h(k) + i*g )mod M  { g = (g(x)mod C) }

 장단점 : 군집화는 거의 없지만, 완벽하지는 않다.

 

4-4)  Chaining

 Hash table의 다른 장소로 보내는 것이 아닌, 충돌이 발생한 장소를 Linked List로 구성해서 같은 자리에 여러개 저장한다.

 

 

 5. 성능 분석

복잡해서 이 수업에서는 다루지 않는다고함.

삽입/삭제는 검색이 선행 됨 > 충돌 미발생 : O(1) / 충돌 발생 : O(N)

적재 밀도 (Loading Density) : N(데이터의 수) / M(배열의 크기)

 ex) Linear probing : 성공확률 = 1/2[ 1 + 1/(1-a) ], a < 0.1 / 실패 : 1/2[ 1 + 1/(1-a)^2 ]

 몰?루

728x90
반응형