조회에는 최악의 경우에도 항상 O (1) 연산이 필요하다는 것을 보장하는 몇 가지 기술이 있습니다.
해시 테이블에 O (1) 연산이있을 가능성이 있는지, 그리고 내 해시 함수에 사용할 기술이 있는지 어떻게 알 수 있습니까?
최악의 경우는 일부 악의적 인 공격자 (Mallory)가 Mallory가 시스템을 느리게 실행하도록 특별히 선택한 데이터를 의도적으로 제공 할 때 발생합니다.
특정 해시 함수를 선택한 후에는 Mallory가 선택한 해시 함수를 찾지 못할 것이라고 가정하는 것이 지나치게 낙관적 일 수 있습니다. Mallory가 선택한 해시 함수를 발견하면 Mallory가 해당 해시 함수를 사용하여 해시 테이블에 삽입 할 많은 데이터를 제공 할 수있게되면 다음과 같은 결과가 초래됩니다. 해시 함수를 사용하여 충돌 할 가능성이있는 데이터 항목을 찾은 다음 충돌 할 가능성이있는 수백만 개에 달하는 데이터 항목을 공급하여 O (1)보다 훨씬 느리게 조회를 수행합니다.
"최악의 경우에도 O (1) 조회"를 보장하는 모든 기술은 향후 모든 가능한 조회가 O (1) 시간에 성공할 수 있도록 각 삽입에 대해 약간의 추가 작업을 수행하여이 문제를 방지합니다. . 특히, Mallory는 조만간 우리가 사용하는 해시 함수를 발견 할 것이라고 가정합니다 (최악의 경우). 그러나 그는 다른 해시 함수 ( 표 해시 또는 기타 범용 해싱)를 선택하기 전에 몇 가지 데이터 항목 만 삽입 할 수있는 기회를 얻었 습니다. 지금까지 보유한 모든 데이터를 2에서 조회 할 수 있도록 특별히 선택했습니다. 또는 3 개의 프로브, 즉 O (1). 우리는이 기능을 무작위로 선택하기 때문에 Mallory가 선택한 기능을 한동안 알지 못할 것입니다. 말로리라도이 새로운 해시 함수를 사용하더라도 이전 데이터와 충돌하는 데이터를 즉시 제공합니다. 다시 해싱 한 후 다시 해시 한 후 자신과 다른 모든 사람이 우리에게 공급 한 모든 이전 데이터를 볼 수 있도록 새로운 해시 함수를 선택할 수 있습니다. 최악의 경우 2 개 또는 3 개의 프로브에서 증가합니다. 즉 최악의 경우 O (1) 조회입니다.
새 해시 함수를 무작위로 선택하고 각 조회가 항상 O (1)임을 보장 할 수있을 정도로 자주 전체 테이블을 다시 해쉬하는 것은 상당히 쉽습니다. 이렇게하면 각 조회가 항상 O (1)임을 보장하는 반면, N-1 항목을 이미 포함하는 해시 테이블에 N 번째 항목을 삽입 할 때 이러한 기술은 때때로 해당 삽입에 O (N) 시간이 필요할 수 있습니다. 그러나 Mallory가 새로운 해시 기능을 사용하여 이전 데이터와 충돌하는 새로운 데이터를 의도적으로 제공하더라도 시스템은 Mallory 및 기타의 많은 항목을 수용하기 전에이를 수용 할 수 있도록 시스템을 설계 할 수 있습니다. 완전 O (N) 재 구축. 최악의 경우에도 O (1) 조회를 보장하기 위해 새로운 기능 및 재해시를 선택하는 해시 테이블 기술은 다음과 같습니다.
- 뻐꾸기 해싱 은 각 키 조회가 최대 2 개의 해시 계산과 2 개의 테이블 조회로 성공하도록 보장합니다.
- hopscotch hashing 은 테이블에서 적은 수의 H (아마도 H = 32) 연속 항목을 검사 한 후 각 키 조회가 성공하도록 보장합니다.
- 다이내믹 퍼펙트 해싱 -Dietzfelbinger의 1994 년 논문은 내가 읽은 첫 번째 논문인데, 각 키 룩업이 항상 2 개의 해시 계산과 2 개의 룩업으로 성공하도록 보장하기 위해 "빈번하게"다시 해시 되더라도 전체 재해시를 거의 수행하지 않기 때문에 각 전체 재해시가 O (n) 시간을 사용하더라도 예상되는 평균 삽입 및 삭제 비용은 O (1)로 상각됩니다.
데이터 구조 / 해시 테이블