(언제) 해시 테이블 조회 O (1)입니까?


70

해시 테이블 조회는 일정한 시간에 작동한다고 말합니다. 해시 값을 계산하면 배열 조회에 대한 색인이 제공됩니다. 그러나 이것은 충돌을 무시합니다. 최악의 경우 모든 항목이 동일한 버킷에 도달하고 조회 시간이 선형이됩니다 ( Θ(n) ).

데이터에 해시 테이블 조회를 실제로 만들 수있는 조건이 있습니까? 그게 유일한 평균, 또는 해시 테이블이 가질 수있는 O ( 1 ) 최악의 경우 조회를?O(1)O(1)

참고 : 저는 프로그래머의 관점에서 왔습니다. 해시 테이블에 데이터를 저장하면 거의 항상 문자열 또는 일부 복합 데이터 구조이며 해시 테이블의 수명 동안 데이터가 변경됩니다. 따라서 완벽한 해시에 대한 답변에 감사하지만 귀엽지 만 일화적이고 내 관점에서는 실용적이지 않습니다.

PS 후속 조치 : 해시 테이블 작업 O (1)는 어떤 종류의 데이터입니까?


3
상각 액세스 시간으로 살 수 있습니까 ? 일반적으로 해시 테이블 성능은 허용 할 스파 스 해시 테이블의 오버 헤드 양과 실제 해시 값이 배포되는 방법에 따라 크게 달라집니다. O(1)
Raphael

5
아, btw : 목록 대신 (균형) 검색 트리를 사용하여 최악의 선형 동작을 피할 수 있습니다.
Raphael

1
@Raphael 나는 상각 할 수 있고 내가 할 수없는 경우 를 설명하는 답변에 매우 관심이 있습니다 . 해시 값이 어떻게 분배되는지에 관해서는, 그것은 정말로 내 질문의 일부입니다. 어떻게 알 수 있습니까? 해시 함수가 값을 잘 분배해야한다는 것을 알고 있습니다. 그러나 그들이 항상 최악의 경우에 도달했다면 결코 도달하지 못할 것입니다. O(1)
Gilles

1
또한 조기 최적화에주의하십시오. 작은 (수천 개의 요소) 데이터의 경우 오버 헤드가 낮아 균형 이진 트리가 해시 테이블보다 성능이 뛰어납니다 (문자열 비교는 문자열 해시보다 훨씬 저렴합니다). O(logn)
isturdy

답변:


41

최악의 경우 얻을 수있는 두 가지 설정이 있습니다 .O(1)

  1. 설정이 정적 인 경우 FKS 해싱은 최악의 보증을 제공합니다. 그러나 당신이 지적했듯이, 당신의 설정은 정적이 아닙니다.O(1)

  2. Cuckoo 해싱을 사용하는 경우 쿼리 및 삭제는 최악의 경우 이지만 삽입은 O ( 1 ) 입니다. Cuckoo 해싱은 총 삽입 수에 대한 상한이 있고 테이블 크기를 약 25 % 크게 설정하면 매우 잘 작동합니다.O(1)O(1)

자세한 정보는 여기에 있습니다 .


3
FKS와 Cuckoo를 확장 할 수 있습니까? 두 용어는 모두 새로운 것입니다.
Gilles

1
동적 퍼펙트 해싱은 어떻습니까? 이는 보유 최악의 조회 및 O는 ( 1 ) 의 삽입 및 결실을 상각. ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.8165 )O(1)O(1)
Joe

2
FKS는 (Fredman, Komlós, Szemerédi)의 이니셜이며 Cuckoo는 브리드 종의 이름입니다. 뻐꾸기 병아리가 둥지에서 알을 낳아주기 때문에이 유형의 해싱에 사용됩니다. 이것은 이것이 가지고있는 메소드의 기능과 다소 유사합니다.
uli

1
@Suresh : 정말요? 나는 항상 확장기가 필요 하다는 독립적 인 기능 이 필요하다고 생각했습니다 . 나는 정정되었다. 내 의견을 약간 삭제합니다. logn
Louis

1
@Suresh가 지적 했듯이이 답변에 대해보다 유용한 의견을 제시하기 위해 cuckoo 해싱은 이론적으로 분석하는 데 사용되는 멋진 (및 큰) 해시 함수 없이 잘 작동합니다 .
Louis

21

이 답변은 TAoCP Vol 3, Ch 6.4의 일부를 요약 합니다.

값 집합 있고, 그 중 n 값 은 m 크기 의 배열 A 에 저장 한다고 가정합니다 . 우리는 해시 함수의 사용 시간 : V의 →의 [ 0 .. M을 ) ; 일반적으로 M | V | . 우리는 α = n 이라고 부릅니다.VnAmh:V[0..M)M|V| 부하율. 여기에서 자연m=M이라고 가정합니다. 실제 시나리오에서 우리는mM을가지고 있으며m자신에게 매핑해야합니다.α=nmAm=MmMm

첫 번째 관찰은 가 균일 한 특성을 가지 더라도 ¹ 동일한 해시 값을 갖는 두 값의 확률이 높다는 것입니다. 이것은 본질적으로 악명 높은 생일 역설 의 사례입니다 . 따라서 우리는 대개 충돌을 처리해야하며 최악의 경우 액세스 시간 O ( 1 )에 대한 희망을 버릴 수 있습니다 .hO(1)

그래도 평균 사례는 어떻습니까? 모든 키 가 동일한 확률로 발생 한다고 가정 해 봅시다 . 확인 된 항목의 평균 수 C S n (성공한 검색) resp. C U n (실패한 검색)은 사용 된 충돌 해결 방법에 따라 다릅니다.[0..M)CnSCnU

체인

nm

CnS1+α2 and CnU1+α22.
이것은 테이블 내부에리스트를 부분적으로 또는 완전히 저장함으로써 약간 향상 될 수 있습니다.

선형 프로빙

v

h(v),h(v)1,,0,m1,,h(v)+1
vα1
CnS12(1+11α) and CnU12(1+(11α)2).
α<0.75 단, chaining² 성능에 필적한다.

더블 해싱

M

CnS1αln(11α) and CnU11α.
이 방법은 브렌트에 의해 조정되었습니다. 그의 변형은 더 저렴한 검색으로 증가 된 삽입 비용을 상각합니다.

테이블에서 요소를 제거하고 테이블을 확장하면 각 방법마다 다양한 난이도가 있습니다.

O(1)αh


h
Hashtable


10

S{0,1,2,...,n}O(1)O(1)lSlxxSO(|l|)SO(|S|)O(|l|+|S|)O(|l||S|)O(log(|l|)|S|)O(|l|)l 를 다른 빈으로 입니다.

편집 : 에서 해시 테이블이 생성되는 방법을 명확히하기 위해O(|l|) :

lUNSUxSllh:U{true,false}hh(x)=falsexUylh(y)=trueO(|l|)O(|U|)

lO(|U|)O(|1|)O(|U|) ).

Uh


O(|l|)O(|S|)O(|l||S|)

hh:U{false,true}h

@Gilles 기본적으로리스트 멤버쉽을위한 룩업 테이블로 사용됩니다. 알려진 자체 및 저렴한 역으로 완벽한 해시 함수가있는 경우 물건 자체를 저장하는 대신 1 비트 만 저장하면됩니다 (고유 해시가있는 것이 추가되었는지 여부). 충돌이 가능한 경우,이를 수행하는 것을 블룸 필터라고하지만, 어떠한 경우에도 멤버십 문제에 대해 명확한 "아니오"를 제공 할 수 있으며, 이는 많은 시나리오에서 여전히 유용합니다.
Patrick87

9

O(1) 최악의 경우 조회를 합니다.

O(1)O(1)O(1)O(1)


완벽한 해시 함수는 완벽하지만 어떻게 얻을 수 있습니까? 비용이 얼마나 듭니까? 충돌의 최대 또는 예상 횟수가 무엇인지 어떻게 알 수 있습니까?
Gilles

2
@Gilles 완벽한 해시 함수는 모든 가능한 입력에 대해 고유 한 해시를 생성하는 모든 함수입니다. 가능한 입력이 유한하고 유일하다면, 이것은 쉬운 일입니다.
Rafe Kettler 2014 년

1
@RafeKettler 입력은 일반적으로 문자열 또는 복합 데이터 구조이며 일반적으로 데이터가 발전함에 따라 항목을 추가 및 제거합니다. 이를 위해 완벽한 해시를 만들려면 어떻게해야합니까?
Gilles

4
네,하지만 그게 요점입니다. 도메인이 범위보다 큰 경우 결정 론적 완벽한 해시 함수가 존재하지 않습니다.
Suresh

@Suresh : 충돌이있을 때마다 새로운 해시 함수를 선택하고 테이블의 크기를 늘릴 수 있다면, 이미 테이블에있는 데이터와 새로운 해시 함수를 찾을 수 있습니다. 삽입하려는 항목-충돌이 없습니다 ( "완벽"). 그렇기 때문에 다이내믹 퍼펙트 해싱은 주기적으로 임의의 새로운 해시 함수를 선택합니다.
David Cary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.