-
[TIL] 스파르타) CS 강의 수강 (HashMap, HashSet)TIL-sparta 2024. 5. 6. 13:50
> 8강. 자료구조를 수강하고, 이전에 잘 몰랐던 부분을 이해한대로 정리해보았다.
학습 키워드: data structure, hashmap, chaining, open addressing, hashset
1. HashMap
1) What is it?:
- Key-value로 맺어진 pair 를 저장하는 Map 자료 구조에서 hash가 더해진 방식이다.
2) How does it work?:
- 임의의 길이를 가진 key 값이 주어지면 이 key를 hash 함수를 통해 고정 길이를 가지는 hash로 변환한다. 변환된 hash값을 이용해 hash table의 해당 hash 주소에 value를 저장하는 방식으로 동작한다.
- key와 value가 모두 고유한 일반적인 map과는 다르게, hashmap의 경우엔 value의 중복을 허용한다.
- 위의 이미지 처럼 간혹 서로 다른 key의 hash 함수로 도출된 hash 값이 동일한 경우가 생긴다. 이를 hash의 collision이라고 부른다. Hash 충돌 현상을 방지하는 대표적인 방법으로는 chaining과 open addressing이 있다.
- chaining: hash 테이블을 array 대신 LinkedList로 구현하는 방법이다. Hash collision시 주소에 새로운 노드를 연결(chaining)한다.
- open addressing: hash 함수로 얻은 hash 주소 외에 다른 주소에 자료를 저장하는 것을 허용하는 방식이다. Linear probing, double hashing 등 여러가지 probing strategy가 존재한다.
- linear probing: h(k, i) = (h'(k) + i) % m 으로, h'(k)가 hash 함수, m이 테이블의 크기다. 매번 중복이 발생할 때 마다 다음 빈 슬롯을 찾아 데이터를 저장하는 방식인데, 이런 식으로 하면 테이블이 커져감에 따라 연속적으로 데이터가 기록되는 구간이 생기는 clustering 현상이 발생하고, 그 구간이 점점 커지면서 탐색 시간이 점점 길어지는 현상이 발생한다.
- double hashing: h(k, i) =(h1(k) +i·h2(k)) % m 으로, h1 과 h2 로 두 개의 hash 함수를 운용하는 방법이다.
- key 값을 통해 데이터를 지울 때 여러모로 난점이 많다.
3) Why use it?:
- HashMap을 사용하면 적은 메모리로도 많은 양의 데이터를 관리할 수 있으며, 시간 복잡도가 O(1)로 상당히 빠르다.
2. HashSet
1) What is it?:
- Set은 중복과 순서가 존재하지 않는, 수학에서의 집합과 같은 개념의 자료구조다. Set의 기본 구현은 프로그래밍 언어별로 다른데, Java의 경우 hash table을 이용하는 HashSet, Binary Search Tree를 이용하는 TreeSet, 순서를 추가해주는 LinkedHashSet 등으로 구현되어 있다.
2) How does it work?:
- 위의 세 가지 구현중 가장 빠른 것은 HashSet이다. 저장할 데이터의 hash 값을 구하고, bucket이라고 불리우는 공간에 해당 데이터를 저장한다. Hash로 저장하는 방식답게 hash값으로 변환 -> 조회로 시간 복잡도가 O(1) 이어서 look up 속도가 매우 빠르다. 중복이 있을 수 없기 때문에, null 값 또한 단 하나만 존재할 수 있다. 반면에 HashMap에서는 key값에 null의 중복이 있을 수 없지만, value의 null은 중복이 가능하다.
3) Why use it?:
- 순서와 상관없이 데이터를 저장하지만, 중복은 없어야하는 경우에 주로 사용된다. 예를 들면, '이벤트 응모자 목록'은 응모자의 응모 순서와 관계없이 누가 응모했는지만 알면 되지만 응모자의 중복이 없어야한다.
--
REFERENCES:
> 강의 노트, 8강. 자료구조~
> GeeksForGeeks, chaining 참고
> GeeksForGeeks, HashMap vs HashSet
> MIT, 'lecture10.pdf' open addressing 부분 일부 참고
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] CSS 기능들 (custom variable, transition) (0) 2024.05.08 [TIL] 스파르타) Project3 마무리 (Dependency Injection) (0) 2024.05.07 [TIL] 스파르타) CS 강의 수강 (Character Encoding, Numbers Representation) (0) 2024.05.05 프로그래머스) 명예의 전당 (1) 문제 풀이 (JavaScript) (0) 2024.05.04 [TIL] 스파르타) Project 3 - 3일 차 (CSS 관련) (0) 2024.05.03