캐시를 고려하더라도 블룸 필터가 해시보다 실제로 더 빠릅니까?


16

블룸 필터는 Int가 일정한 시간에 99 % 확실성으로 설정되어 있는지 확인할 수 있다고 생각하면 정말 멋지게 보입니다. 그러나 해시에서 대부분의 경우 메모리에 한 번만 액세스한다는 유일한 차이점만으로도 해시가 가능합니다. 블룸 필터를 사용하면 완전히 먼 곳 에서 요청 당 ~ 7 번 액세스해야 하므로 요청 당 여러 개의 캐시 미스가 발생합니다.

뭔가 빠졌습니까?


완전히 먼 곳? m 비트 만 있습니다. 아마도 단일 레지스터 또는 최악의 경우 단일 캐시 라인에 적합합니다.

1
@delnan AFAIK 그것은 약 10 비트 / 요소를 사용합니다. 따라서 수천 개의 요소 (예 : 거대한 데이터 저장소)의 경우 캐시에 맞지 않습니다. 따라서 k해시 를 사용하는 경우 k읽기 당 캐시 누락 이있을 수 있습니다 . 반면 해시 테이블은 대부분 캐시 미스에 대한 답변을 대부분 보장합니다-어쨌든 충돌은 거의 없습니다.
MaiaVictor

k 비트, 마침표가 있습니다. 모든 요소는 동일한 고정 비트 수에 영향을 미치기 때문에 오 탐지율은 항목 수에 따라 달라집니다.

답변:


33

두 데이터 구조가 해시 충돌을 처리하는 방법이 누락되었습니다. 블룸 필터는 실제 값을 저장하지 않으므로 필요한 공간은 지정된 배열의 일정한 크기입니다. 대신 전통적인 해시를 사용하면 주어진 모든 값을 저장하려고 시도하므로 시간이 지남에 따라 커집니다.

단순화 된 해시 함수 (예를 들어!)를 고려하십시오 f(x) = x % 2. 이제 다음 정수를 입력하십시오 2, 3, 4, 5, 6, 7..

표준 해시 : 주어진 값이 해시됩니다, 우리는 인해 충돌의 많은 끝 f(2) = f(4) = f(6) = 0f(3) = f(5) = f(7) = 1. 그럼에도 불구하고 해시는 이러한 모든 값을 저장하며 값 8이 저장되어 있지 않다는 것을 알 수 있습니다. 어떻게합니까? 충돌을 추적하고 모든 값을 동일한 해시 값으로 저장 한 다음 쿼리 할 때 쿼리를 추가로 비교합니다. 따라서에 대한 맵을 쿼리 해 봅시다 8: f(8) = 0이미 삽입 한 버킷을 살펴보고 입력의 일부가 아닌 2, 4, 6것을 알려면 3 번의 비교가 필요합니다 8.

블룸 필터 : 일반적으로 각 입력 값은 k다른 해시 함수 에 대해 해시됩니다. 다시 한 번, 단순성을 위해 단일 해시 함수 만 사용한다고 가정 해 봅시다 f. 우리는 2 개의 값으로 구성된 배열이 필요하며 입력 2을 받으면 f(2) = 0배열 값을 위치 0로 설정하여 값을 설정 한다는 의미입니다 1. 동일에 대한 발생 46. 마찬가지로 입력은 3, 5, 7각각 배열 위치 1를 value로 설정합니다 1. 이제 경우 우리는 쿼리 8입력의 일부 : f(8) = 0위치의 배열이 0있다 1, 그래서 꽃 필터 것이다 거짓 주장 8참으로 입력의 일부였다.

좀 더 사실적으로 표현하기 위해 두 번째 해시 함수를 추가하는 것을 고려해 봅시다 g(x) = x % 10. 두고, 입력 값의 2두 해시 값에 이르게 f(2) = 0하고 g(2) = 2두 해당 배열의 위치로 설정한다 1. 물론 배열은 이제 size 이상이어야합니다 10. 그러나 우리가 쿼리 할 때로 인해 8위치에서 배열을 검사 하고 그 위치는 여전히입니다 . 그렇기 때문에 해시 함수를 추가하면 오 탐지를 줄일 수 있습니다.8g(8) = 80

비교 : 블룸 필터는 k해시 함수를 사용하므로 최대 k임의의 배열 위치에 액세스 할 수 있습니다. 그러나 그 수치는 정확합니다. 해시는 대신 상각 된 일정한 액세스 시간만을 보장하지만 해시 함수 및 입력 데이터의 특성에 따라 생성되지 않을 수 있습니다. 따라서 생성되지 않은 경우를 제외하고 일반적으로 더 빠릅니다.

그러나 해시 충돌이 발생하면 표준 해시는 저장된 값과 쿼리 값이 같은지 확인해야합니다. 이 동등성 검사는 임의로 비쌀 수 있으며 블룸 필터에서는 발생하지 않습니다.

공간과 관련하여 지정된 배열보다 더 많은 메모리를 사용할 필요가 없기 때문에 블룸 필터는 일정합니다. 반면 해시는 동적으로 커지고 충돌하는 값을 추적해야하기 때문에 훨씬 커질 수 있습니다.

절충 : 이제 무엇이 싸고 무엇이 아닌지 어떤 상황에서 알았는지, 절충을 볼 수 있어야합니다. 블룸 필터는 이전에 값을 보았지만 오탐 (false positive)으로 살 수 있다는 것을 매우 빠르게 감지하려는 경우 유용합니다. 반면 런타임을 정확하게 판단 할 수없는 가격으로 정확성을 보장하려는 경우 해시 맵을 선택할 수 있지만 평균보다 훨씬 느린 경우에 따라 변질 된 경우는 수용 할 수 있습니다.

마찬가지로, 제한된 메모리 환경에있는 경우 메모리 사용 보장을 위해 블룸 필터를 선호 할 수 있습니다.


좋은 대답입니다. 이것이 내가 혼란 스러웠습니다. 실제로 모든 데이터 구조에는 최상의 사용 사례가 있으며 다른 고려 사항은 트레이드 오프에 따라 다릅니다.
Richard

실제로 적절한 예를 통해 아주 좋은 설명입니다. 그렇다면 우리는 어떻게 'k'값을 가지고 가야합니까? 우리가 가진 총 가치에 달려 있습니까?
itsraghz

5

블룸 필터 및 해시의 사용 사례는 고유하고 대부분 분리되어 있으므로 직접 비교는 의미가 없습니다. 게다가 다른 트레이드 오프로 해시 충돌을 처리하는 많은 방법이 있기 때문에 구현의 기술적 세부 사항에 의존합니다.

블룸 필터는 요소가 적당한 크기의 메모리를 사용하여 정확한 확률은 아니지만 합리적인 확률 로 거대한 세트 세트 에 있는지 여부를 응답 할 수 있습니다 . 수조의 요소와 같은 거대한. 그러나 그들은 결코 정확하지 않습니다. 더 많은 메모리 또는 더 많은 해시 함수를 사용하여 오 탐지 양을 줄일 수 있습니다.

반면 해시 테이블은 정확하지만 세트를 저장해야합니다. 따라서 수조 개의 요소에는 테라 바이트의 메모리가 필요합니다 (미국의 조수에 불과합니다). 또한 블룸 필터로는 할 수없는 각 요소에 대한 추가 데이터를 저장할 수 있습니다.

따라서 블룸 필터는 메모리에 적합하지 않거나 클라이언트에 전송하는 것이 불가능한 대형 세트의 일부 멤버 (서버 조회, 디스크 읽기 등)에 대한 데이터를 가져 오는 느린 방법이있을 때 사용됩니다. 세트에없는 오브젝트에 대해 느린 조작을 실행하지 않으려 고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.