티스토리 뷰
김희성의 개발자 면접 cs 강의/ 스터디
Hash Collision (해시 충돌)
- 서로 다른 Key 값에 대해서 Hash 함수의 반환 값이 동일한 경우를 말한다.
- key의 값의 경우의 수는 무한하지만 메모리상 버킷사이즈는 줄일 수 밖에 없다. (Java에서 HashMap<>()의 initial Capacity는 16으로 정의되어있음) 그 때 버킷사이즈를 늘리기위해 리사이징하는 과정에서 해시 충돌 발생
- 연산 속도도 빠르며, 해시 충돌이 가능 한 발생하지 않아야 성능이 좋은 Hash 함수라 할 수 있다.
Hash Collision (해시 충돌) 해결 방법
- Open Addressing
- 해시 충돌이 발생한 경우 비어있는 버킷을 찾아서 저장한다.
- 해시 충돌이 발생한 경우, 탐색/접근의 시간 복잡도가 O(N) 으로 증가한다.
- 비어있는 버킷을 찾는 알고리즘
- Linear Probing (선형 프로빙) (예시)
- Quadratic Probing (이차식 프로빙)
- Double Hashing (이중 해시)
- Chaining
- 해시 충돌이 발생한 버킷에 Linked List(Bin) 를 만들고, 해당 Linked List에 데이터를 저장한다.
- Linked List로 연결할 경우 접근/탐색 에 O(N)의 시간이 걸리기 때문에 성능 이 저하된다
- Linked List로 연결했을 경우 성능 저하 문제를 해결하기 위해 BST 를 사용할 수 있다.
- Java 에서는 Chaining 전략을 사용하며 해시 충돌이 발생한 버킷에 대해 7개 Bin 까지는 Linked List로, 8개 이상이 되면 BST (Red-Black Tree)로 변경한다. 반대로 8개에서 Remove에 의해 Bin의 개수가 줄어들면, 6개에서 Linked List로 변경한다.
Load Factor : 저장할 데이터의 수 대비 너무 작은 버킷 사이즈로 인해 성능이 저하되는 것을 방지하 기 위해 HashTable(HashMap)은 데이터가 어느 수준(Load Factor)이 이상 추가되면, 버킷의 사이즈를 늘리고(2배) Rehashing 을 수행한다. //O(N)
'망공부 > CS' 카테고리의 다른 글
| [자료구조] 알고리즘 (2) | 2023.11.03 |
|---|---|
| [자료구조] Priority Queue (0) | 2023.09.17 |
| [자료구조] HashTable (HashMap, unordered_map(set)) (0) | 2023.09.14 |
| [자료구조] Queue, Deque, Stack (0) | 2023.09.11 |
| [자료구조] Array, ArrayList (0) | 2023.09.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프론트엔드
- intellij
- hash
- 스프링시큐리티
- 자바
- 프로그래머스
- codingtest
- NestJS
- HashMap
- Hashtable
- Nest
- 코딩테스트
- 스프링부트
- 코딩
- 알고리즘
- 자바공부
- Java
- 시간복잡도
- 자료구조
- 인텔리제이
- 웹개발
- 문자열출력
- 코테
- 네스트
- springboot
- Annotation
- 코딩공부
- programmers
- Spring
- coding
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함