본문 바로가기

오늘의 공부/자료구조와 알고리즘

[Hash table]

1.Limit of divide and conquer :

the efficiency is limited to the logarithm of the problem size!

still remain time complex..

 

2. Searching and sorting without comparison!!

but... how..?

 

3.  Hash Table : Dictionary 형식 key , value 사용!

hash funtion은 key를 이용하여 array index를 찾아 거기에 value를 store 한다! -> time complex 없이 그냥 찾을 수 있음!

f( Key ) -> array index -> store value

* one key -> one index * multi key -> one index

 

 

Hash function

value의  key를 array의 index로 convert하는 함수!

 

(1) perfect hash function

-무제한의 공간에 -제한적인 input size가 있고 -key와 index는 모두 1:1 대응( Bijective Function) 

그러나.. 사실 구현하기 불가능하며.. 이렇게 그냥 막 늘여놓는다면 hash function을 쓰는 이유가 없다!

 

(2) Good hash function

-uniform distribution 인덱스당 store된 key가 적당히 분포되어 있어야 하고 

- low cost 계산 비용이 적어야 하며 

- determinism 딱딱 나와야하고

-variable range 인덱스 range가 size를 넘어가면 안된다.

여전히 uniform distribution하기 어렵지만.. 그래도 해볼만하다!!

 

 Hash function의 예

1) Modulo based hash function   f( key ) : key % num → index

- divide a numeric key with number

-(1)  low cost : 나누기만 하면 됨!

-(2) range : [0, num-1] 적절~

-(3) uniform distribution 하기 쪼끔 어려움 : key 의 정보값을 너무 많이 버리게 됨 ㅠㅠ

 

2) Square based hash function f( key ) : MidSquare(key^2) % num → index

-(1)  low cost : 쪼끔 비용은 들지만 이정도면 soso~

-(2) range : [0, num-1] 적절~

-(3) 더 많은 key 정보를 사용하므로 uniform 하게 됨 -> collision 적어짐!

 

3) Digit analysis based hash function f( key ) : DigitSum(key) % num → index

-수를 나타내는 숫자를 이용함!!!!

-(1)  low cost : 완전 적게 든다.

-(2) range : [0, num-1] 적절~

-(3) 안 쓰는 key 정보가 없다! uniform 하게 됨 -> collision 적어짐!

 

collision resolution of hashing

하나의 index에 여러개의 key 값이 entry 되면 발생... 운명임...

collision을 가늠할 수 있는 수치가 바로 Load factor

-N: size of the stored entries

-S: size of hash table

Load factor : N/ S  → [0,1]

 

Collision resolution by closed addressing

-index에 여러개의 key를 store하는 것! (chaining)

 

-how? table에 linked list의 Head만 저장해 놓고, 새로운 값이 들어오면 linked list에 이어나감. 

                                (linked list 아니더라도 tree root도 가능함~ 근데 무거워질 수 있음)

-worst case : 하나의 index에 그냥 다 store하는 것 : linked list와 다름 없음;;

-Deletion : 그냥 bucket 으로 가서 linked list 따라가서 지우면 됨! easy~

 

Collision resolution by opened addressing

-index 에는 오직 한 개의 key만 store!! 다른 index 찾아가라!

 

-Probing(다른 index 찾아가는 법) :

(1) Linear probing : 방이 없으면 바로 다음 bucket을 찾아감

f(key) + i

 

(2) Quadratic probing  방이 없으면 다음 i^2 번째 bucket을 찾아감 

f(key ) + i + i^2

Q . i^2 를 찾아가는 이유?  result가 뭉친 지점이 존재한다. 그 때는 index 몇 개 옆으로 가봐야 어차피 다 차있음... 차라리 cluster 지점을 벗어나는 것이 좋다.

 

-Deletion : Lazy deletion을 해야 함.

지우지 않고 remove 표시만 해 둠. 이후 Load factor 가 커지면 새로운 hash table에 전체 정보를 copy를 하게 되는데 이때 표시된 원소는 copy 하지 않음.

 

 

'오늘의 공부 > 자료구조와 알고리즘' 카테고리의 다른 글

DP 는 아직도 너무 어렵다.  (0) 2020.03.31
[Sorting Algorithm]  (0) 2020.02.23
Genetic Algorithm  (0) 2020.02.21
Priority Queue and Heap  (0) 2020.02.20
Big O notation  (0) 2020.02.17