logo

데이터 구조의 해싱

해싱 빠른 액세스를 허용하는 방식으로 데이터를 효율적으로 저장하고 검색하는 기본 데이터 구조입니다. 여기에는 해시 테이블의 특정 인덱스에 데이터를 매핑하는 작업이 포함됩니다. 해시 함수 키를 기반으로 정보를 빠르게 검색할 수 있습니다. 이 방법은 데이터베이스에서 일반적으로 사용됩니다. 아프게 하는 시스템과 다양한 프로그래밍 애플리케이션을 통해 검색 작업을 최적화합니다.

데이터 구조 - 해싱

내용의 테이블



작동 방식:

  1. 해시 함수: 해시 함수에 데이터 항목을 제공합니다.
  2. 해시 코드: 해시 함수는 데이터를 처리하고 고유한 해시 코드를 제공합니다.
  3. 해시 테이블: 그런 다음 해시 코드는 해시 테이블 내의 특정 위치를 가리킵니다.

해시 함수

그만큼 해시 함수 을 취하는 함수이다 열쇠 그리고 반환 색인 해시 테이블 . 해시 함수의 목표는 해시 테이블 전체에 키를 균등하게 분배하여 충돌을 최소화하는 것입니다(두 키가 동일한 인덱스에 매핑되는 경우).

일반적인 해시 함수는 다음과 같습니다.

  • 분할 방법: 키 % 해시 테이블 크기
  • 곱셈 방법: (키 * 상수) % 해시 테이블 크기
  • 범용 해싱: 충돌을 최소화하도록 설계된 해시 함수 제품군

해시 충돌이란 무엇입니까?

해시 충돌은 두 개의 서로 다른 키가 해시 테이블의 동일한 인덱스에 매핑될 때 발생합니다. 이는 좋은 해시 함수를 사용해도 발생할 수 있으며, 특히 해시 테이블이 가득 차거나 키가 유사한 경우 더욱 그렇습니다.

해시 충돌의 원인:

  • 불량한 해시 함수: 해시 테이블 전체에 키를 균등하게 분배하지 않는 해시 함수는 더 많은 충돌을 일으킬 수 있습니다.
  • 높은 부하율: 로드 계수(해시 테이블 크기에 대한 키 비율)가 높으면 충돌 가능성이 높아집니다.
  • 유사한 키: 값이나 구조가 유사한 키는 충돌할 가능성이 더 높습니다.

충돌 해결 기술

충돌 해결 기술에는 두 가지 유형이 있습니다.

  1. 공개 주소 지정:
    • 선형 프로빙: 빈 슬롯을 순차적으로 검색
    • 2차 프로빙: 2차 함수를 사용하여 빈 슬롯 검색
  2. 폐쇄 주소:
    • 연결: 각 인덱스의 연결된 목록 또는 이진 검색 트리에 충돌 키를 저장합니다.
    • 뻐꾸기 해싱: 여러 해시 함수를 사용하여 키 배포

해싱의 응용

해시 테이블은 다음을 포함하여 다양한 애플리케이션에 사용됩니다.

  • 데이터베이스: 고유 키를 기반으로 데이터 저장 및 검색
  • 캐싱: 빠른 검색을 위해 자주 액세스하는 데이터 저장
  • 기호 테이블: 프로그래밍 언어의 값에 식별자 매핑
  • 네트워크 라우팅: 데이터 패킷에 대한 최적의 경로 결정

해싱이란 무엇입니까?
  • 인덱스 매핑(또는 단순 해싱)
  • 충돌 처리를 위한 별도의 연결
  • 충돌 처리를 위한 개방형 주소 지정
  • 이중 해싱
  • 부하율 및 재해싱
  • 해싱에 대한 쉬운 문제

    • 배열이 다른 배열의 하위 집합인지 확인
    • 두 연결리스트의 합집합과 교차점
    • 배열 A[]와 숫자 x가 주어지면 A[]에서 합이 x인 쌍을 확인합니다.
    • 배열에서 동일한 요소의 두 발생 사이의 최대 거리
    • 같은 라인의 최대 포인트 계산
    • 배열에서 가장 빈번한 요소
    • 1에서 n-1 사이에서 유일하게 반복되는 요소 찾기
    • 주어진 두 세트가 서로소인지 확인하는 방법은 무엇입니까?
    • 두 세트의 겹치지 않는 합
    • 두 배열이 같은지 확인하십시오.
    • 범위에서 누락된 요소 찾기
    • 고유 요소가 있는 하위 집합의 최소 수
    • 두 배열에 공통 요소가 존재하지 않도록 최소 요소 수를 제거합니다.
    • 쌍의 요소가 다른 행에 있도록 주어진 합계로 쌍을 찾습니다.
    • 주어진 합계로 쌍 계산
    • 합계가 주어진 값 x와 동일한 4개의 정렬된 배열에서 4배를 계산합니다.
    • 빈도별로 요소 정렬
    • a % b = k가 되는 배열에서 모든 쌍 (a, b)를 찾습니다.
    • 동일한 문자 세트로 단어 그룹화
    • 배열의 k번째 고유(또는 반복되지 않는) 요소입니다.

    해싱에 대한 중간 문제

    • 주어진 티켓 목록에서 여행 일정 찾기
    • 모든 직원 아래의 직원 수 찾기
    • 합을 k로 나눌 수 있는 가장 긴 부분 배열
    • 합이 0인 가장 큰 부분배열 찾기
    • 가장 긴 증가하는 연속 부분 수열
    • 크기가 k인 모든 창에서 고유 요소 수 계산
    • 주어진 합계로 하위 배열 찾기 | 세트 2(음수 처리)
    • Java에서 별도의 연결을 사용하여 자체 해시 테이블 구현
    • C++에서 개방형 주소 지정 선형 프로빙을 사용하여 자체 해시 테이블 구현
    • 순열이 허용되는 회문을 형성하기 위한 최소 삽입
    • 배열의 두 하위 집합의 가능한 최대 차이
    • 간단한 해시 함수를 사용하여 정렬
    • k개의 고유 숫자를 갖는 가장 작은 부분 배열

    해싱의 어려운 문제

    • 임의 포인터를 사용하여 이진 트리 복제
    • 0과 1의 수가 동일한 가장 큰 부분 배열
    • 주어진 값으로 합산되는 모든 고유한 삼중항
    • 회문 하위 문자열 쿼리
    • 배열 요소의 주파수에 대한 범위 쿼리
    • 범위의 모든 요소가 배열에 존재하도록 추가할 요소
    • Cuckoo Hashing – 최악의 경우 O(1) 조회!
    • 원본 배열과 동일한 총 개별 요소를 갖는 하위 배열 개수 계산
    • 동일한 순서를 유지하는 주어진 두 배열의 최대 배열
    • 주어진 배열에 대한 모든 고유 하위 배열 합계의 합계를 찾습니다.
    • 레카망 수열
    • 가장 긴 엄격한 바이토닉 부분 수열의 길이
    • 모든 중복 하위 트리 찾기
    • 모서리가 1인 이진 행렬에 직사각형이 있는지 확인

    빠른 링크 :

    권장사항:

    • 데이터 구조와 알고리즘 배우기 | DSA 튜토리얼