채널톡 아이콘

인프런 커뮤니티 질문&답변

brianyhs님의 프로필 이미지

작성한 질문수 3

김영한의 실전 자바 - 중급 2편

컬렉션 프레임워크 - Map 구현체

HashSet과 HashMap 메소드의 시간 복잡도에 대해 여쭤봅니다.

해결된 질문

작성

·

101

·

수정됨

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.
HashSet과 HashMap의 주요 메소드의 시간복잡도에 대해 정리한 내용인데, 제대로 이해했는지 올려봅니다.

 

1. HashMap은 hash table 역할을 하는 배열을 내부적으로 갖는데 기본 크기는 16이며, 저장되는 요소가 배열 크기의 75%를 초과하면 크기가 두배로 늘어나며 요소들은 re-hashing된다.
2. 특정 인덱스에 저장되는 데이터가 8개 이상이 되면, 이 데이터들은 red-black tree 형태로 변환되어 add(), get(), remove()와 같은 메소드를 호출할 때 O(log N)의 접근 효율을 제공한다.
3. 하지만 인덱스에 8개 이상이 아닌 2~7개의 데이터가 저장되는 경우 강의에서 설명한대로 데이터 접근에 대한 O(N)의 효율이 나온다. (해시 충돌 설명 인용)
4. 그리고 HashSet은 HashMap을 기반으로 하기 때문에 위 1~3번 역시 HashSet에 동일하게 적용된다.
(HashSet의 경우 각각 add(), contains(), remove())

 

위 정리가 맞다고 가정해도, 특정 인덱스에 8개 이상의 요소가 저장되는 경우가 드물기 때문에
경우에 따른 시간 복잡도를 저렇게까지 깊게 구분할 필요가 없는걸까요..?

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

brianyhs님께서 정리하신 HashSet과 HashMap의 시간 복잡도에 대한 질문에 대해 안내드리겠습니다.

  1. HashMap의 내부 구조:

    • 맞습니다. HashMap은 내부적으로 해시 테이블을 사용하며, 기본 크기는 16입니다. 저장되어 있는 요소의 수가 75%를 초과하면 자동으로 크기가 두 배로 늘어나며, 모든 요소들은 재해싱됩니다.
  2. Red-Black Tree 변환:

    • 정확합니다. 특정 인덱스에 저장된 데이터의 개수가 8개 이상이 되면, 이들은 Red-Black Tree로 변환되어 add(), get(), remove() 등의 메소드 호출 시 시간 복잡도가 O(log N)로 개선됩니다.
  3. 해시 충돌로 인한 리스트 사용:

    • 데이터가 2~7개인 경우, 링크드 리스트 방식을 사용하며, 이때의 시간 복잡도는 O(N)입니다. 이를 통해서 HashMap에서의 해시 충돌이 발생하는 상황을 잘 설명하셨습니다.
  4. HashSet과의 관계:

    • HashSet은 내부적으로 HashMap을 사용하므로, HashMap에서의 시간 복잡도 설명이 HashSet에도 동일하게 적용됩니다.

마지막으로, 특정 인덱스에 8개 이상의 요소가 저장되어 Red-Black Tree로 변환되는 경우가 실제로는 드물 수 있습니다. 따라서 일반적인 사용에서는 평균적으로 O(1)의 시간 복잡도를 가지고 있다고 볼 수 있습니다. 하지만 특정 성능이 중요한 시점이나, 데이터의 형태에 따라서는 각각의 시간 복잡도 케이스를 이해하는 것이 중요할 수 있습니다. 질문 주신 내용 모두 잘 이해하고 계신 것 같습니다.

도움되셨기를 바라며, 추가 질문이 있다면 언제든지 남겨주세요! 😊

참고하시기 바랍니다:
- StackOverflow - HashMap in Java
- Spring Boot Reference Documentation: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto

질문 주셔서 감사합니다!