해시 테이블

Hash table
해시 테이블
유형순서 없는 연관 배열
발명된1953
O 표기의 시간 복잡도
알고리즘. 평균 최악의 경우
공간 θ([1]n)O(n)
서치 θ(1)O(n)
삽입 θ(1)O(n)
삭제 θ(1)O(n)
해시 테이블로서의 작은 전화번호부

컴퓨팅에서 해시 맵 또는 사전으로도 알려진 해시 테이블은 키에 매핑할 수 있는 구조인 집합 추상 데이터 유형을 구현하는 데이터 구조입니다.해시 테이블은 해시 함수를 사용하여 원하는 값을 찾을 수 있는 버킷 또는 슬롯 배열로 인덱스를 계산합니다.조회 중에 키가 해시되고 결과 해시는 대응하는 값이 저장되어 있는 위치를 나타냅니다.

해시 함수는 각 키를 하나의 버킷에 할당하는 것이 이상적이지만 대부분의 해시 테이블 설계에서는 불완전한 해시 함수를 사용합니다.이 때문에 해시 함수가 여러 키에 대해 동일한 인덱스를 생성하는 해시 충돌이 발생할 수 있습니다.그러한 충돌은 일반적으로 어떤 식으로든 수용된다.

고차원 해시 테이블에서 각 룩업의 평균 시간 복잡도는 테이블에 저장되어 있는 요소의 수에 의존하지 않는다.또한 많은 해시 테이블 설계에서는 키-값 쌍상각[2][3][4]작업당 일정한 평균 비용으로 임의로 삽입 및 삭제할 수 있습니다.

해시는 시공간의 트레이드오프의 한 예입니다.메모리가 무한대인 경우 키 전체를 인덱스로 직접 사용하여 단일 메모리 액세스로 값을 찾을 수 있습니다.한편, 무한대의 시간을 사용할 수 있는 경우는, 키에 관계없이 값을 보존할 수 있어 바이너리 검색이나 선형 검색을 사용해 [5]: 458 요소를 검색할 수 있습니다.

대부분의 경우 해시 테이블은 검색 트리나 다른 테이블 검색 구조보다 평균적으로 더 효율적입니다.이러한 이유로 특히 연관 배열, 데이터베이스 인덱싱, 캐시세트 등 다양한 종류의 컴퓨터 소프트웨어에 널리 사용됩니다.

역사

해시에 대한 생각은 다른 장소에서 독립적으로 일어났다.1953년 1월, Hans Peter Luhn은 체인과 해싱을 사용하는 IBM 내부 메모를 작성했습니다.오픈 어드레싱은 나중에 Luhn의 논문에서 A.[6]: 15 D. Linh 빌딩에 의해 제안되었다.비슷한 시기에 IBM Research의 Gene Amdahl, Elaine M. McGraw, Nathaniel Rochester 및 Arthur Samuel은 IBM 701 어셈블러[7]: 124 위해 해시를 구현했습니다.선형 프로브를 사용한 오픈 어드레싱은 Amdahl에 의한 것으로 인정되지만, Ershov는 독립적으로 같은 생각을 [7]: 124–125 가지고 있었습니다."오픈 어드레싱"이라는 용어는 W에 의해 만들어졌습니다. Wesley Peterson은 큰 [6]: 15 파일 검색의 문제를 논하는 그의 기사에 있습니다.

체인을 이용한 해시에 관한 첫 번째 연구는 나머지 모듈 프라임을 해시 [6]: 15 함수로 사용하는 아이디어를 논의한 Arnold Dumey의 공로를 인정받았다.해싱이라는 단어는 로버트 [7]: 126 모리스의 기사에 의해 처음 출판되었다.선형 탐침의 이론적 분석은 원래 Konheim과 [6]: 15 Weiss에 의해 제출되었습니다.

개요

해시 테이블은 n 요소의 집합 S(\ m m 연관 A(\ A 저장하는 데 사용되는 집합 데이터 유형의 구현입니다. 서 m m n 시간이 더 복잡합니다.자체 밸런싱 바이너리 검색 [6]: 1 트리와 비교하여 검색, 삭제 및 삽입 작업을 수행합니다. x x 인덱스 A [(x A [h에 저장됩니다.h(\ h 해시 함수이며 h < ) < h( < [6]: 2 입니다.

부하율

해시 테이블의 중요한 통계량이며 [1]다음과 같이 정의됩니다.

어디에

  • n은 해시 테이블에서 사용되는 엔트리의 수입니다.
  • k는 버킷의 수입니다.

해시테이블의 성능은 [6]: 2 에 비해 저하되므로 [8]1에 가까워지면 해시테이블의 크기가 조정되거나 재탕됩니다.부하계수가 max / _}/[8] 으로 떨어졌을 경우에도 테이블 크기가 변경됩니다. α(\ \alpha})의 허용 가능한 수치에는 0.6과 0.[9][10]: 110 75가 포함됩니다.

해시함수

h(\ h h {,. . , - h {\ h: ... 내의 또는 슬롯을 각 h , ., - 1 { {0 , 배열합니다. x {x \ S} m <\ m < }해시 함수의 기존 구현은 테이블의 모든 요소가 {,. , - { U = \ { 0 , . , u - 1} { }의 길이가 컴퓨터 [6]: 2 아키텍처워드 크기 내에서 제한된다는 정수 우주 가정에 기초하고 있습니다.

완벽 h h SS})의x({x})가 0 -({[11][12]의 고유한 값에 매핑되도록 주입함수로 정의되며,[11] 모든 키를 미리 알고 있으면 완벽한 해시함수를 생성할 수 있습니다.

정수 우주 가정

정수 우주 가정에 사용되는 해싱 방식에는 나눗셈에 의한 해싱, 곱셈에 의한 해싱, 범용 해싱, 동적 완전 해싱 및 정적 완전 [6]: 2 해싱이 포함됩니다.그러나 일반적으로 사용되는 방식은 [13]: 264 [10]: 110 나눗셈별 해싱입니다.

분할별 해시

나눗셈별 해시 방식은 다음과 같습니다.[6]: 2

서 M M x x S 해시 다이제스트이며 n n 테이블의 크기입니다.

곱셈에 의한 해시

곱셈에 의한 해시 방식은 다음과 같습니다.[6]: 2–3

서 A A 실수값 상수입니다.곱셈에 의한 해시의 장점은 m[6]: 2–3 m이 하지 않다는 것입니다. A 해시 함수를 생성하지만 Donald Knuth황금 [6]: 3 비율을 사용할 것을 권장합니다.

충돌 해결

해시를 사용하는 검색 알고리즘은 두 부분으로 구성됩니다.첫 번째 부분은 검색 키를 배열 인덱스로 변환하는 해시 함수를 계산하는 것입니다.두 개의 검색 키 해시가 동일한 배열 인덱스에 없는 것이 이상적입니다.그러나 항상 그렇지는 않으며 보이지 않는 데이터에 대해 [14]: 515 보증하는 것은 불가능합니다.따라서 알고리즘의 두 번째 부분은 충돌 해결입니다.충돌 해결을 위한 두 가지 일반적인 방법은 개별 체인과 개방형 주소 [5]: 458 지정입니다.

개별 체인

별도의 체인으로 해시 충돌 해결
버킷 배열의 헤드 레코드와의 개별 체인에 의한 해시 충돌.

별도의 체인으로 프로세스에는 각 검색 배열 인덱스에 대한 키-값 쌍이 포함링크 목록이 구축됩니다.충돌한 항목은 단일 링크된 목록을 통해 함께 연결되며, 이 목록을 통해 고유한 검색 [5]: 464 키로 항목에 액세스할 수 있습니다.링크 목록과의 체인을 통한 충돌 해결은 해시 테이블의 일반적인 구현 방법입니다.T T x x 각각 해시 테이블과 노드로 다음과 [13]: 258 같이 동작합니다.

체인드 해시 삽입(T, k) 링크드리스트 T [h(k)]체인드 해시 검색(T, k) 링크드리스트 T [h(k)]체인드 해시 삭제(T, k)에서  k가진 요소검색합니다.

요소가 숫자 또는 어휘로 비교 가능하며 전체 순서를 유지하여 목록에 삽입된 경우 실패한 [14]: 520–521 검색이 더 빨리 종료됩니다.

개별 체인을 위한 기타 데이터 구조

키를 주문하면 자기 밸런싱 바이너리 검색 트리를 사용하는 등의 "자기 조직화" 개념을 사용하는 것이 효율적일 수 있습니다.이것에 의해 이론적으로 최악의 경우는 On O로 낮아질 수 있습니다.단,[14]: 521 복잡성이 더해지지만,

다이내믹 퍼펙트 해싱에서는 최악의 경우 룩업의 복잡성을 O 줄이기 위해 2레벨 해시 테이블이 사용됩니다.이 기술에서는 kk 엔트리의 2 k 슬롯을 완벽한 해시 테이블로 구성되어 있으며,[15] 최악의 경우 검색 시간과 삽입에 대한 상각 시간이 단축됩니다.연구에 따르면 어레이 기반의 개별 체인은 부하가 [16]: 99 높은 표준 링크드 리스트 방식과 비교하여 97% 더 높은 성능을 발휘하는 것으로 나타났습니다.

또한 각 버킷에 대해 퓨전 트리를 사용하는 등의 기술을 사용하면 [17]가능성이 높은 모든 작업에 일정한 시간이 걸립니다.

캐싱 및 참조 위치

링크 리스트의 노드가 메모리 전체에 분산되어 있는 경우, 링크 리스트의 개별 체인 실장의 링크 리스트는 공간적인 인접성(참조 장소)의해 캐시에 영향을 주지 않을 수 있습니다.따라서 삽입 및 검색 중에 리스트 트래버스가 발생할 수 있습니다.[16]: 91

캐시를 의식한 변형에서는 링크 리스트 또는 셀프밸런싱 바이너리 검색 트리가 다른 체인을 통해 콜리젼을 해결하기 위해 일반적으로 캐시에 적합한 다이내믹 어레이를 사용합니다.이는 어레이의 연속적인 할당 패턴이 변환 의 하드웨어 캐시 프리페터에 의해 악용될 수 있기 때문입니다. lookaside buffer: 접근시간과 메모리 [18][19][20]소비를 줄입니다.

오픈 어드레싱

선형 프로브를 사용하여 열린 주소 지정을 통해 해시 충돌이 해결되었습니다(http=1)."Ted Baker"는 독특한 해시를 가지고 있지만, 그럼에도 불구하고 "John Smith"와 충돌했던 "Sandra Dee"와 충돌했다.
이 그래프는 대형 해시 테이블(캐시 크기를 훨씬 초과)에서 요소를 검색하는 데 필요한 CPU 캐시 손실의 평균 수를 체인 및 선형 검색과 비교합니다.선형 프로빙은 참조 인접성이 우수하기 때문에 성능이 향상되지만 테이블이 가득 찰수록 성능이 크게 저하됩니다.

오픈 어드레싱은 모든 엔트리 레코드가 버킷 배열 자체에 저장되고 검색을 통해 해시 해결이 실행되는 또 다른 충돌 해결 기법입니다.새 엔트리를 삽입해야 할 경우 버킷이 검사됩니다.해시된 슬롯부터 시작하여 사용 중인 슬롯이 발견될 때까지 프로브 시퀀스로 진행됩니다.항목을 검색할 때 버킷은 대상 레코드가 발견되거나 사용되지 않은 배열 슬롯이 발견될 때까지 동일한 순서로 검색됩니다. 이 슬롯은 [21]검색에 실패했음을 나타냅니다.

잘 알려진 프로브 시퀀스는 다음과 같습니다.

  • 선형 프로브 - 프로브 간 간격이 고정됩니다(일반적으로 1).[22]
  • 2차 프로빙 - 원래 해시 [23]: 272 계산에 의해 주어진 값에 2차 다항식의 연속적인 출력을 더함으로써 프로브 사이의 간격을 증가시킵니다.
  • 이중 해시: 프로브 간의 간격이 보조 해시 [23]: 272–273 함수에 의해 계산됩니다.

로드 계수α(\ [8][16]: 93 1에 가까워지면 프로브 시퀀스가 증가하므로 오픈 어드레싱의 성능은 개별 체인에 비해 느릴 수 있습니다.테이블이 [5]: 471 완전히 채워진 경우 로드 계수가 1에 도달하면 프로빙에 의해 무한 루프가 발생합니다.선형 프로브의 평균 비용은 클러스터 형성이 검색 시간을 [5]: 472 증가시키기 때문에 클러스터링을 피하기 위해 테이블 전체에 요소를 균일하게 분산시키는 해시 함수의 능력에 따라 달라집니다.

캐싱 및 참조 위치

슬롯은 연속된 위치에 있으므로 선형 검색을 통해 참조의 인접성으로 인해 CPU 캐시의 활용률이 향상되어 메모리 [22]지연 시간이 단축될 수 있습니다.

오픈 어드레싱을 기반으로 한 기타 충돌 해결 방법

통합 해시

병합된 해시는 별도의 체인과 오픈어드레싱의 하이브리드로 버킷 또는 노드가 [24]: 6–8 테이블 내에서 링크됩니다.이 알고리즘은 고정 메모리 [24]: 4 할당에 매우 적합합니다.병합된 해시의 충돌은 해시 테이블에서 가장 큰 인덱스 빈 슬롯을 식별하여 해결되며 충돌 값이 해당 슬롯에 삽입됩니다.버킷은 충돌하는 해시 [24]: 8 주소를 포함하는 삽입된 노드의 슬롯에도 연결됩니다.

뻐꾸기 해싱

Cuckoo 해싱은 오픈 충돌 해결 기술의 한 형태로, O(1O(1) 최악의 경우 룩업이 복잡해지고 삽입 시 상각 시간이 하게 유지됩니다.충돌은 각각 자체 해시 기능을 가진 2개의 해시 테이블을 유지함으로써 해결되며 충돌한 슬롯은 지정된 항목으로 대체되고 슬롯의 프리 점유된 요소는 다른 해시 테이블로 대체됩니다.이 프로세스는 모든 키가 테이블의 빈 버킷에 자체 스팟을 가질 때까지 계속됩니다.순서가 무한 루프 상태가 되면(임계값 루프 카운터를 유지함으로써 식별됨), 양쪽 해시 테이블이 새로운 해시 함수로 재플래시되고 절차가 계속됩니다.[25]: 124–125

홉스코치 해시

Hopscotch 해싱뻐꾸기 해싱, 선형 프로빙 및 체인의 요소를 버킷의 인근 개념으로 결합하는 오픈 어드레싱 기반 알고리즘입니다.버킷은 특정 점유된 버킷 주위에 후속 버킷으로 "가상"[26]: 351–352 버킷이라고도 합니다.이 알고리즘은 해시 테이블의 부하 계수가 90%를 초과할 때 더 나은 성능을 제공하도록 설계되었으며 동시 설정에서 높은 throughput을 제공하므로 크기가 조정 가능한 동시 해시 [26]: 350 테이블을 구현하는 데 적합합니다.