Resolve Hash Collision (Linear Probing)

2023. 4. 13. 21:04·📚 Data Architect/Data Structure
목차
  1. 💡 선형조사법 (Linear Probing)
  2. 예시
  3. 해결
  4. 단점
  5. 💡 2차식 조사법(quadratic probing)
  6. 💡 이중 해싱(double hashing)
  7. 💡 팁
  8. 이중 해싱이 선형 조사법, 2차식 조사법보다 데이터를 더 골고루 넣을 수 있는 이유는?

💡 선형조사법 (Linear Probing)

채우려는 공간이 이미 차 있다면, 비어있는 칸을 찾을 때까지 다음 칸을 확인하는 방법이다.
비어있는 칸을 찾아 그 곳에 채운 후 위치가 바뀌었다는 사실을 알려야 한다.


예시

  • 객체 x
    • 객체 x의 hashCode 값인 h를 구한다.
    • h를 양수로 변환 -> h & 0x7FFFFFFF;
    • 테이블의 크기와 % 연산 -> h % table.size();
    • h를 가지고 x를 적절한 위치로 저장, 이 때 위치는 hashCode의 값에 따라 다름
  • 객체 y
    • 위와 동일한 방법으로 h를 구한다.
    • x의 위치와 동일한 값이 나오면 x의 위치에 y를 저장해야 한다.
    • 이런 상황을 충돌이라고 한다.

해결

  • x의 다음 칸에 y를 저장
    • y의 위치가 바뀌었다는 사실을 알려야 한다.\
    • 삭제의 경우 데이터 삭제 후 null이 아닌 데이터가 삭제되었다는 별도의 표시가 필요하다.
    • 즉, null에 도착할 때 까지 위치값을 +1 씩 더하면서 자료구조를 탐색하는 것이다.

단점

관계가 있든 없든 데이터가 뭉치게 된다. (비효율적)

결국 배열에 순차적으로 추가하게 되어버린다.

이 문제를 해결하기 위한 2차식 조사법이 있다.


💡 2차식 조사법(quadratic probing)

이미 값이 있는 배열 칸에 무언가를 넣으려 할 때 선형조사법처럼 위치값에 +1을 하지 않고,
그 값의 제곱만큼 더하는 방법


ex:
hash value 의 1제곱
hash value의 2제곱
...


다음 칸 대신 1부터 순서대로 제곱하여 더한 칸( 1^212, 2^222, ... )을 확인하는 방법이다.
테이블의 끝을 넘어간다면 % 연산을 해서 다시 테이블의 범위 안에 들어오게 한다.


💡 이중 해싱(double hashing)

hashCode 함수가 2개 있어 채우려는 공간이 이미 차 있다면
두 hashCode의 결과를 더한 값을 테이블 내의 위치가 되게 하는 방법이다.

  • 이 두 HashCode의 결과를 더한 값은 요소가 들어가야 할 테이블 내의 위치값이 된다.

이중 해싱은 아예 다른 해시 함수를 사용할 수 있기 때문에 데이터를 더 골고루 넣을 수 있다.
하지만 첫 위치를 알기위한 기본적인 Hash 함수와, 그 자리가 차 있을떄 호출하는 두번째 해시 함수
2개의 Hash 함수가 필요하다는 단점이 있다.

  • 2번째 hashCode 함수는 첫 함수와 달라야 한다.
  • 0을 반환하면 안된다.

💡 팁

이중 해싱이 선형 조사법, 2차식 조사법보다 데이터를 더 골고루 넣을 수 있는 이유는?

선형 조사법과 2차식 조사법은 더하는 값(1, 2, 3, ... 또는 1^2, 2^2, 3^2, ...)에 규칙성이 있는 반면에,
이중 해싱은 두번째 해시 함수가 리턴하는 값이 임의적이기 때문에 배열의 더 다양한 위치에 값을 저장할 수 있다.

저작자표시 (새창열림)

'📚 Data Architect > Data Structure' 카테고리의 다른 글

Hash Chaining & loadFactor  (0) 2023.04.13
Hash  (0) 2023.04.13
Queue  (0) 2023.04.13
Stack  (0) 2023.04.13
Doubly Linked List & Circular Linked List  (0) 2023.04.13
  1. 💡 선형조사법 (Linear Probing)
  2. 예시
  3. 해결
  4. 단점
  5. 💡 2차식 조사법(quadratic probing)
  6. 💡 이중 해싱(double hashing)
  7. 💡 팁
  8. 이중 해싱이 선형 조사법, 2차식 조사법보다 데이터를 더 골고루 넣을 수 있는 이유는?
'📚 Data Architect/Data Structure' 카테고리의 다른 글
  • Hash Chaining & loadFactor
  • Hash
  • Queue
  • Stack
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      GStreamer #Pipeline
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Resolve Hash Collision (Linear Probing)
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.