algorithm/theory

선형 탐사법.

qkqhxla1 2016. 7. 13. 15:35

해시 테이블의 크기 M이 레코드의 개수 N보다 클때 사용하는 것으로 동일 주소로 해시되는 원소가 있으면 해시 테이블상의 오른쪽으로 이동하면서 비어있는 공간을 찾아서 첫번째로 만나는 빈 공간에 원소를 저장시킨다.


특징.

해시 테이블에서 할당된 공간이 연속해서 나타나는 뭉치가 있으면 이게 더 커지는 현상이 발생할수 있는데 이것을 집적화(클러스터링)라고 부른다. 이러한 집적화가 발생하게 되면 평균 탐색 시간을 증가시켜 성능을 저하시키게 된다.


ex.

레코드의 갯수 N=17일때 해시 함수를 h(k) = k mod 19라고 하자.

키값이 (1, 19, 5, 1, 18, 3, 8, 9, 14, 7, 5, 24, 1, 16, 12, 5) 라고 하면....

1은 [1]에 들어간다.(1%19==1)

19는 [0]에 들어간다.(19%19==0)

5는 [5]에 들어간다.(5%19==5)

그다음 1은 [2]에 들어간다.(1%19==1 인데 1자리에 이미 채웠으므로 그 바로 오른쪽인 2에 채운다.)

이런식으로 하나하나 채우는 방법이다.


아래 코드를 실행시켰을때 #가 나오는건 데이터가 찬 부분이고, 공백은 데이터가 없는 부분인데 위에서 말한것처럼 집적화가 심하게 일어남을 알수 있다.

# -*- encoding: cp949 -*-
from __future__ import print_function
import random
import time
N = 10000
M = 10391

class Dict:
     def __init__(self):
         self.a = [-1 for i in range(M)]
     def search(self,v):
         x = hash(v,M)
         while self.a[x] != -1:
             if v==self.a[x]:
                 return self.a[x]
             else:
                 x = (x+1) % M
         return -1
     def insert(self,v):
         x = hash(v,M)
         while self.a[x] != -1:
             x = (x+1) % M
         self.a[x] = v
     def prints(self):
         for i in range(M):
             if self.a[i] != -1: print('#',end='')
             else: print(' ',end='')
             if (i+1)%70 == 0: print()
         print()
def hash(v,M):
    return v%M

def main():
    d = Dict()
    key = [-1 for i in range(N)]
    search_key = [-1 for i in range(N)]
    for i in range(N):
        key[i] = search_key[i] = random.randint(1,65536)
    for i in range(N):
        d.insert(key[i])
    d.prints()
    s = time.time()
    for i in range(N):
        result = d.search(search_key[i])
        if result == -1 or result != search_key[i]:
            print (result,i)
            print(u'탐색 오류. {} {}'.format(result,i))
    print(u'선형 탐사법의 실행 시간 (N = {} ) : {}\n탐색 완료.'.format(N,time.time()-s))

if __name__=='__main__':
    main()


'algorithm > theory' 카테고리의 다른 글

링크드 리스트 등등등.  (0) 2016.07.22
이중 해싱  (0) 2016.07.14
레드-블랙 트리 탐색.  (0) 2016.06.29
이진 삽입 정렬(binary insertion sort)  (0) 2016.06.18
동적 계획법(다이나믹 프로그래밍, DP).  (0) 2016.06.17