Hash 자료구조 - java

Hash 자료구조란?


  • keyValue 가 쌍을 이루는 자료구조
  • key 탐색의 시간복잡도가 O(1) 이다.
  • key 삭제의 시간복잡도가 O(1) 이다.
  • key와 Value 삽입의 시간복잡도가 O(1) 이다.

Hash 자료구조의 경우 검색과 삽입, 삭제 연산을 엄청 빠르게 하는 자료구조라고 할 수 있다. 위에서 기술했듯이 상수시간에 데이터를 검색하는데, 이것은 Hash 자료구조의 특성 덕분이다. 

 Hash 자료구조에 KeyValue 를 삽입하려면, 우선 key에 해당하는 데이터를 Hash Function (해시 함수) 를 통해 Hash Code

변환한 뒤에, 자료구조 크기로 % 연산을 통해 해당 데이터를 저장할 index 를 구한다. 그리고 Value 를 해당 index 에 저장한다.

 

 

 

Hash Collision - 해쉬 충돌


어떤 데이터를 삽입하려고 할 때, 해쉬 함수에 의해 반환되는 hash code 에 이미 데이터가 존재하는 경우가 있다. 이런 경우를 Hash  Collision 이라고 하며, 이것을 해결하기 위한 방법이 존재한다.

 

 

  • Chaining 
    • 해쉬 충돌이 일어날 경우, 데이터들을 링크드 리스트 형태로 연결한다.
    • 모든 key 값이 같은 Hash Code 를 가지는 최악의 경우, O(n) 의 시간복잡도를 가질 수 있다.
    • 데이터를 탐색할 때 key 에 대한 인덱스가 가리키고 있는 LinkedList 를 선형 검색하여, 해당 키에 대한 데이터를 반환한다.
  • Open Addressing
    • 해쉬 충돌에 대해서 Linked List 와 같은 추가적인 메모리를 사용하지 않고, Hash Table 의 빈 공간을 사용하는 방법
    • 해쉬 충돌에 대비해 Hash Table 의 크기를 크게 잡아야 한다.
    • Linear Probing
      • 해쉬 충돌이 발생할 때 순차적으로 다음 인덱스를 탐색하여 빈 공간에 키와 데이터를 삽입하는 방식
      • 순차적으로 삽입하기 때문에 이 역시 최악의 경우 시간복잡도가 O(n) 이 될 수 있다.
    • Double Hashing
      • 충돌이 일어난 키를 다른 해시 함수로 계산하여 그 값을 현재 주소에 더하여 새 주소를 얻는 방식

 

Hash 의 단점


  • 순서/ 관계가 있는 배열에는 어울리지 않는 자료구조이다.
  • 데이터가 저장되기 전에 저장공간을 미리 생성해야 한다. 또한 해쉬 함수에 따라 해쉬 충돌이 자주 발생할 수 있으며, 만들어진 공간이 사용되지 않을 수 있어 메모리 낭비가 심할 수 있다.
  • Hash Function 에 대한 의존도가 높다. 

'알고리즘' 카테고리의 다른 글

자료구조 - 힙 (Heap) java  (0) 2022.02.04