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

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

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

해시 알고리즘6 - 해시 충돌 구현

해시 충돌에 대해서 질문이요

해결된 질문

작성

·

71

·

수정됨

0

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


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

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

[질문 내용]
안녕하세요. 궁금증이 생겨서 질문을 올립니다.

해시 리스트? 를 만들고, 데이터를 넣다 보면 어쩔 수 없이 해시 충돌이 일어날 수 밖에 없을것 같은데요.

여기서 질문이 생깁니다.

영한님이 쓰신 대로 링크드 리스트를 이용해서, 해시 리스트를 만들었다고 치고

데이터를 넣다 보니, 해시 충돌이 여러 번 일어나는 경우가 생겼습니다.

 

여기서 해시 충돌이 몇번 일어 나는게, 최악의 상황인가요?

캐파시티를 40개 로 해 놓고, for문으로 8만개의 숫자를 넣어보니

image.png

사진처럼 나오던데요. (제컴 기준 i3, 렘16기가)

즉 질문은

해시 충돌을 계속 일으켜야 하는 상황 이라면, 해시 충돌을 몇 번 일으 키는게 메모리 상? 안전한가요?

답변 부탁 드립니다.

답변 1

0

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

생각하는자님이 해시 충돌에 대해 궁금해하신 부분 정말 중요한 질문입니다. 해시 테이블과 같은 구조에서는 해시 충돌이 필연적이며, 이를 어떻게 관리하느냐가 효율성과 성능에 큰 영향을 미칩니다.

해시 충돌이란?

해시 충돌은 서로 다른 두 개의 키가 동일한 해시 값을 가지는 상황을 말합니다. 해시 충돌을 처리하는 일반적인 방법 중 하나가 LinkedList를 이용해 충돌이 발생한 해시 값을 가진 데이터를 체이닝(chaining) 방식으로 관리하는 것입니다. 영한님께서 강의에서 사용하는 방식 역시 이러한 체이닝 방법입니다.

몇 번의 해시 충돌이 최악의 상황인가?

버킷 수(여기서는 40개)보다 훨씬 더 많은 데이터를 삽입하면 충돌이 빈번하게 발생할 수 있으며, 이는 자연스러운 현상입니다. 중대한 해시 충돌은 각각의 버킷이 상당히 많은 요소들을 가지고 있는 경우를 말합니다. 이상적인 경우, 모든 키가 유일한 해시 값을 가지고 있어 모든 버킷이 동일한 크기로 데이터를 포함하는 것입니다. 그러나 현실적으로 이는 극히 드뭅니다.

  • 충돌이 보통 많이 발생하는 이유는 해시 함수가 비효율적이거나 버킷 수가 너무 적을 때 발생합니다. 버킷 수가 적지만 많은 데이터를 처리해야 하는 경우에는 충돌이 빈번해질 수밖에 없습니다.

  • 영한님이 설명한 대로 해시 테이블의 충돌이 체이닝을 통해 해결될 수 있지만, 각 버킷 내의 충돌 처리에 시간이 많이 소요될 수 있습니다. 따라서 성능적으로 최적화하기 위해서는 적절한 버킷 수와 효율적인 해시 함수가 필요합니다.

해시 테이블에서 좋은 성능을 유지하기 위한 조언:

  1. 적절한 해시 함수 선택: 데이터의 특성과 패턴을 잘 고려하여 해시 함수를 설계하십시오. 이는 충돌을 줄이는 좋은 방법 중 하나입니다.

  2. 버킷 수 조절: 데이터의 양에 따라 버킷 수를 동적으로 조절하는 것이 좋습니다. 일반적으로 데이터를 많이 처리하는 경우에는 더 많은 버킷을 설정해 주는 것이 좋습니다.

  3. 로드 팩터(Load Factor): 이는 버킷의 총 개수 대비 저장한 데이터 개수의 비율입니다. 일반적으로 로드 팩터가 0.7 정도 될 때 리사이징을 고려합니다.

질문 내용과 관련된 다른 토론을 보고 싶으시면 링크드 리스트로 해시 충돌을 처리하는 이유에 대한 질문을 참고해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ai인턴의 말에 '일반적으로 로드 팩터가 0.7 정도 될 때 리사이징을 고려합니다.' 라는데 그러면 아에 과적수용은 없고 0.7일때 무조건 리사이징? 한다는 말인가요?
그리고 '중대한 해시 충돌은 각각의 버킷이 상당히 많은 요소' 라고 하는데 많은 요소가 어떤 많은 요소 인가요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 생각하는자님

  1. 컬렉션 프레임워크 - Set 부분을 끝까지 들어보시면 궁금한 부분들이 해결되실거에요 🙂


    (자바가 제공하는 Set4- 최적화에서 해당 부분을 자세히 설명드립니다)

감사합니다.

영한님 알겠습니다. 감사합니다.

생각하는자님의 프로필 이미지
생각하는자

작성한 질문수

질문하기