맵(Map) 시간복잡도 질문
선생님의 맵 강의에서 시간복잡도에서 궁금한 점이 생겼습니다
맵을 사용할 때 조회, 삽입, 삭제 시 O(log N)이 걸린다고 설명해주셨는데 이건 일반적인 경우를 말하는건가요?
자바 HashMap은 조회나 삽입 삭제 시 시간복잡도 O(1)로 알고 있어서요
최악의 경우에는 충돌때문에 O(N)까지 걸린다고 알고있습니다.
자바 HashMap은 내부적으로 해시테이블로 구현되어있어서 그렇지만 일반적으로는 O(log N)이라고 말해야 하나요?
Answer 2
0
안녕하세요 ㅎㅎ
자바 HashMap은 조회나 삽입 삭제 시 시간복잡도 O(1)로 알고 있어서요
...
자바 HashMap은 내부적으로 해시테이블로 구현되어있어서 그렇지만 일반적으로는 O(log N)이라고 말해야 하나요?
-> 이건 맵이 아니라 해시테이블로 봐야 하며 최악의 경우 O(n), 보통 O(1)로 보는게 맞습니다.
이 해시테이블은 배열과 연결리스트로 구현이 되며 여기서 충돌이 많이 날 경우 연결리스트의 시간복잡도상 O(N)이 걸리는 것이죠.
하지만 자바8부터는 버킷내 연결 리스트의 요소 갯수가 8개 이상이면 Red-Black Tree (레드-블랙 트리) 로 변환됩니다. 이 자료구조는 O(logN)의 시간복잡도를 갖는데요.
즉, 자바의 hashmap의 경우
자바 8미만의 경우
최악의 경우 O(N), 보통 O(1)
자바8이상부터
연결 리스트의 요소 갯수가 8개 이상일 때 최악의 경우 O(logN), 보통 O(1)
연결 리스트의 요소 갯수가 6개 이하일 때 최악의 경우 O(N), 보통 O(1)
이라고 보시면 됩니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다. 3831568님.
맵(Map) 자료구조의 시간 복잡도에 대한 궁금증이 있으시군요. 맵의 시간 복잡도를 이해하기 위해서 다양한 맵 구현 방법을 알아두는 것이 좋습니다.
일반적인 맵(Map)의 시간 복잡도:
- 맵은 보통 트리 기반으로 구현되며 이 경우 각각의 연산(삽입, 삭제, 조회)에서 O(log N)의 시간 복잡도를 가지게 됩니다. 이는 맵이 일반적으로 이진 검색 트리(BST)나 자가 균형 이진 검색 트리(예: 레드-블랙 트리)로 구현되기 때문입니다.
- 맵은 보통 트리 기반으로 구현되며 이 경우 각각의 연산(삽입, 삭제, 조회)에서 O(log N)의 시간 복잡도를 가지게 됩니다. 이는 맵이 일반적으로 이진 검색 트리(BST)나 자가 균형 이진 검색 트리(예: 레드-블랙 트리)로 구현되기 때문입니다.
자바 HashMap의 시간 복잡도:
- 자바의
HashMap은 해시 테이블로 구현되어 있어, 이상적으로 조회, 삽입, 삭제가 O(1)의 시간 복잡도를 가집니다. 하지만 해시 충돌이 발생하면, 내부적으로 연결 리스트나 트리(자바 8 이상에서는 충돌이 심한 경우 트리로 전환)로 관리되는데, 이로 인해 최악의 경우 O(N)이 될 수 있습니다.
- 자바의
왜 O(log N)이라는 설명이 나오는가?
- 질문에서 언급한 O(log N)은 주로 트리 기반의 맵, 예를 들어
TreeMap을 설명할 때 사용됩니다.TreeMap은 이진 검색 트리로 구현되어 있어 전형적인 O(log N)의 시간 복잡도를 보입니다.
- 질문에서 언급한 O(log N)은 주로 트리 기반의 맵, 예를 들어
따라서 HashMap의 경우 일반적으로 O(1)이지만, 이는 충돌이 적절히 관리되는 이상적인 상황을 가정한 것이며, 구현방식과 사용상황에 따라서는 O(N)이 될 수도 있음을 알고 있는 것이 중요합니다. 특정 맵 구현에 따라 시간 복잡도가 달라질 수 있기 때문에 어떤 상황에서든지적합한 맵을 선택하는 것이 중요합니다.
이와 관련된 구체적인 질문 및 더 자세한 설명이 필요하시다면 다음 링크의 질문과 답변들을 참고해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
REST API (Self-descriptive messages)
0
22
1
시스템 엔지니어 관련 질문입니다.
0
50
2
오버라이딩 관련하여 질문드립니다.
0
61
2
교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유
0
88
1
렌더 트리, 렌더 레이어와 그래픽 레이어
0
55
2
로컬스토리지, 세션스토리지, 쿠키의 공통점
0
66
1
IPv4가 IPv6보다 빠른 경우
0
97
2
UDP가 전송계층의 역할을 못하는 건 아닌지
0
58
1
Path MTU 발견하였음에도 패킷 분할이 필요한 이유?
0
65
2
교재의 LFU 알고리즘에서 6번이 왜 히트인가요?
0
62
2
페이지 교체 알고리즘? 프레임 교체 알고리즘?
0
80
2
Static 키워드가 메모리에 올라가는 시점
0
74
2
헤더 압축부분 질문드립니다
0
71
2
공유 캐시 관련 질문 드립니다.
0
55
2
컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?
0
198
1
회선과 대역폭의 관계
0
59
2
44강 질문
0
91
2
버스 토폴로지 질문 있씁니다
0
51
1
자바스크립트, xml 문법 관련
0
63
2
전략패턴과 의존성주입 질문
0
68
2
Model이 비즈니스 로직을 담당하나요?
0
105
2
CS 공부 하는 법
0
180
2
큰돌님 블로그에 개념정리해서 올려도될까요!
0
136
2
FIN 세그먼트 질문
0
69
2

