안티 블룸 필터가 있습니까?


25

블룸 필터가 효과적으로 다양한 값이 이미 처리 동안 발생했는지 여부를 추적하는 것이 가능하다. 많은 데이터 항목이있는 경우 Bloom 필터는 해시 테이블에서 메모리를 크게 절약 할 수 있습니다. 해시 테이블과 공유하는 Bloom 필터의 주요 기능은 항목이 새 항목이 아닌 경우 항상 "새 항목 아님"이라고 표시하지만 항목이 "새 항목이 아님"으로 표시 될 가능성은 0이 아닙니다 "새로운 때에도.

반대 행동을하는 "Bloom anti-Bloom filter"가 있습니까?

다시 말해, 아이템이 새로운 경우 "신규"라고 말하지만 새로운 것이 아닌 일부 아이템에 대해서는 "신규"라고 말하는 효율적인 데이터 구조가 있습니까?

앞에서 본 모든 항목 (예 : 정렬 된 링크 목록)을 유지하면 첫 번째 요구 사항을 충족하지만 많은 메모리를 사용할 수 있습니다. 편안한 두 번째 요구 사항을 감안할 때 필요하지 않기를 바랍니다.


보다 공식적인 치료를 선호하는 사람들 은 Bloom 필터가 x 가 새로운 것으로 생각하면 , 그렇지 않으면 b ( x ) = 0 , x가 정말로 새로운 경우 n ( x ) = 1 이라고 쓰고 n ( x 그렇지 않으면 ) = 0 입니다.b(x)=1xb(x)=0n(x)=1xn(x)=0

그런 다음 Pr[b(x)=0|n(x)=0]=1 ; Pr[b(x)=0|n(x)=1]=α ; Pr[b(x)=1|n(x)=0]=0; Pr[b(x)=1|n(x)=1]=1α 일부, 0<α<1 .

I는 해달라고 : 않는 함수를 구현하는 효율적인 데이터 구조에 존재하는 b 일부 0<β<1 ,되도록 Pr[b(x)=0|n(x)=0]=β ; Pr[b(x)=0|n(x)=1]=0 ; Pr[b(x)=1|n(x)=0]=1β ; Pr[b(x)=1|n(x)=1]=1 ?


편집 : 이 질문은 이전에 /programming/635728/cstheory/6596 과 같이 StackExchange에서 요청 된 것으로 보입니다 . done "에서"일부 비용으로 수행 할 수 있음 "에서" 의 값을 바꾸면 간단합니다 b. " "올바른"답변이 무엇인지는 아직 명확하지 않습니다. 무엇 이며 분명한 것은 (Ilmari 카로 넨가 제시 한 하나 같은) 오히려 잘 작동 어떤 종류의 LRU 캐싱 방식은 구현하기 쉽다는 점이다, 내 코드를 실행하는 데 걸리는 시간이 50 % 감소 귀착되었다.


어떤 이유로, 이것은 캐시 및 캐시 배치 알고리즘이 해결하려고 시도하는 문제와 매우 유사하다고 말하고 싶습니다. 자주 사용하지 않는 (LFU) 교체를 사용하는 캐시를 고려하십시오. 이론적으로 최적이지만 불가능한 대체 알고리즘은 캐시와 마찬가지로 가장 오랫동안 다시 볼 수없는 알고리즘을 제거하는 것입니다. 캐싱은 일반적으로 보유하지 않을 분포의 특성에 대한 몇 가지 가정에 의존한다고 가정하지만 이것이 적용되는지 고려할 가치가 있습니다.
Patrick87

다음과 같은 대화에 관심이있을 수 있습니다 : 만족도 기반 세트 멤버쉽 필터
Kaveh

@Kaveh : 포인터 주셔서 감사합니다.
András Salamon

답변:


12

Patrick87의 해시 아이디어와 함께 여러분의 요구 사항 을 거의 충족시키는 실용적인 구조 가 있습니다. 예전 값에 대해 새로운 값을 잘못 잘못 입력 할 가능성은 거의 없지만 무시할 수 없을 정도로 작게 만들 수 있습니다.

nkn=128k=16Hn+k

a2k nn2k

  • xij=H(x)ikjnH(x)ai=j

  • 값 가 필터에 추가 되었는지 테스트하려면 위와 같이 를 계산하고 인지 확인하십시오 . 그렇다면 true를 반환하십시오. 그렇지 않으면 false를 반환합니다.xij=H(x)ai=j

주장 1 : 오 탐지 확률 (= 거짓으로 주장 된 새로운 값)은 입니다. 이것은 을 증가시킴으로써 저장 공간에서 적당한 비용으로 임의로 작게 만들 수있다 . 특히, ,이 확률은 본질적으로 무시할 수 있으며, 실제로 하드웨어 오작동으로 인한 오 탐지 확률보다 훨씬 작다.1/2n+knn128

특히, 개의 별개의 값이 검사되고 필터에 추가 된 후, 적어도 하나의 오 탐지 발생 확률은 입니다. 예를 들어, 및 인 경우 50 % 확률로 오 탐지를 얻는 데 필요한 고유 값의 수는 약 입니다.N(N2N)/2n+k+1n=128k=162(n+k)/2=272

클레임 2 :가 음성 확률 (= 이전에 추가 된 값이 새 것으로 잘못 주장 됨)은 (여기서 은 필터에 추가 된 고유 값의 수입니다.보다 구체적으로, 테스트중인 특정 값 이후 에 추가 고유 값의 수가 가장 최근에 필터에 추가되었습니다).1(12k)N1exp(N/2k)<N/2kN


추신. "매우 작은 크기"를 원근법으로 표현하기 위해 일반적으로 현재 알려진 기술로 는 128 비트 암호화가 깨지지 않는 것으로 간주됩니다 . 로이 구성표에서 오 탐지를 얻는 것은 누군가 자신의 첫 번째 시도에서 비밀 128 비트 암호화 키 올바르게 추측하는 것 입니다. ( 및 인 경우 실제로는 그보다 약 65,000 배 적습니다.)n+k=128n=128k=16

그러나 그래도 여전히 비이성적으로 긴장감을 느끼면 항상 전환 할 수 있습니다 . 그것은 스토리지 요구 사항을 다시 한 번 겠지만, 나는 안전하게 당신에게 당신이 그 이름을하지하는 걱정 것 어떤 합계 내기 할 것이다 아무도 이제까지 와 가양 참조 - 해쉬 함수가 어쨌든, 파손되지 않는 것으로 가정합니다.n=256n=256


1
하드웨어 오작동 확률과 비교할 수있을뿐만 아니라; 또한 누군가 첫 번째 시도에서 SSH 로그인 위해 RSA 키를 추측 할 가능성과 비교할 수 있습니다 . 후자는 IMO가 솔루션보다 실용성이 뛰어납니다.
R ..

+1 매우 훌륭함-이해하면 항목이 실제로 새 항목 일 때 "아주 새롭지 않은"것으로 잘못 응답 할 수있는 (매우 작은) 기회를 허용함으로써 공간 효율성 문제를 해결한다는 것입니다. 매우 실용적이고 좋은 분석.
Patrick87

1
주장 1은 괜찮은 해시 함수가 충돌 가능성이 낮다는 것을 나타냅니다. 실제로 가 50 이상인 경우에는 이미 적용됩니다 . 내 응용 프로그램의 경우 및 은 간단한 64 비트, 비 암호로 안전하지만 빠른 해시 기능으로 훌륭하게 작동합니다. n+kn=44k=20
András Salamon

@ AndrásSalamon : 보안 암호화 해시 함수는 실제로 약간 더 강력한 보증을 제공하지만, 의도적으로 검색 하려고하더라도 충돌하는 입력을 찾는 것이 비현실적 입니다. 이 충분히 큰 (예 : 위에서 제안한 ), 이는 오 탐지 비용이 높고 적을 찾으려고 적극적으로 시도 하더라도 전체 데이터를 저장할 필요가 없음을 의미합니다 . 물론 매우 강력한 보증이 필요하지 않은 경우 다소 높은 충돌 위험이 허용 될 수 있습니다. nn=128
Ilmari Karonen

1
@Newtopian 암호화 해시 함수를 지정한 이유 는 무차별 대입보다 더 효과적으로 충돌을 생성하는 알려진 방법이 없기 때문에 (즉, 많은 입력을 테스트하고 충돌하는 항목을 선택하여) 해시가 고려되기 때문입니다. (예를 들어, 오늘날 MD5는 고장입니다). 따라서 암호화 해시의 경우 충돌 확률이 이상적인 임의 해시 함수와 동일하다고 가정 할 수 있습니다. 범용 해시 기능 또는 키가있는 MAC (임의 비밀 키 포함)을 사용하면이 보장이 더욱 강력 해집니다.
Ilmari Karonen

8

아니요, 데이터 구조가 실제로 새 것이면 "새로운 것"이라고 보장하려면 (이 경우에는 "새로운 것이 아님"이라고 말하지 않음) 이러한 속성을 사용하여 효율적인 데이터 구조를 가질 수 없습니다. 실제로는 새롭고 허위 부정은 허용되지 않습니다). 이러한 데이터 구조는 모든 데이터가 "새로운 것이 아닌"응답을 유지하도록해야합니다. 정확한 근거 는 ctstheory에 대한 pents90의 답변을 참조하십시오 .

반면에 블룸 필터 데이터 구조가 새롭지 않은 경우 효율적인 방식으로 "새로운 것이 아니라"고 보장 할 수 있습니다 . 특히, 블룸 필터는 모든 데이터를 저장하는 것보다 더 효율적일 수 있습니다. 각 개별 항목은 상당히 길 수 있지만 블룸 필터의 크기는 전체 길이가 아닌 항목 에 따라 조정됩니다 . 문제에 대한 모든 데이터 구조 는 데이터 항목 수가 아닌 전체 데이터 길이 에 따라 확장되어야합니다 .


또한 같은 질문이 있기 때문에 허용 된 답변을보십시오.
Joe

-1 불가능하다고 말했을 때의 의미를 인정해야합니다. 분명히 효율적으로 수행 할 수 있으며 낮은 오류율로 수행 할 수 있으므로 주어진 구현에서 약간의 균형을 맞추는 것이 가능해야합니다 ... 특히 의미가 무엇인지 정확하게 설명하는 것이 유용 할 것입니다 "모든 데이터"는 질문의 요구를 충족시키기 위해 반드시 필요한 것은 아닙니다. 대답이 "새로운 것이 아니어야"할 때 "신규"로 응답하는 잘못된 부정이 여기에 허용되므로 모든 데이터를 보존 할 필요는 없습니다.
Patrick87

1
이 답변은 완벽하게 합리적이며 내 질문의 편지를 다루는 것 같지만 정신은 아닙니다.
András Salamon

@DW 답변을 업데이트하는 데 시간을 내 주셔서 감사합니다. 안티 블룸 필터의 비 효율성을 설명 할 때 사용되는 언어에 반대하지만, 참조 된 "세부 사항"에 대해 좀 더 정교하게 만드는 것이 최선이라고 생각합니다. .. 지금은 -1을 그대로 둡니다. 쓸모없는 의견을 정리했습니다.
Patrick87

@DW "거짓 부정"으로 답이 "새롭지 않아야"할 때 "새"로 응답하려고합니다. (직관적으로 직관적이지 않은 "새로운 것이 아니라"는 긍정적 인 사례입니다.) 전체 요소를 저장해야한다고 생각하지만 "모든 데이터를"저장할 필요는 없습니다. 모든 요소가 아님
Patrick87

6

해시 테이블은 어떻습니까? 새 항목이 표시되면 해시 테이블을 확인하십시오. 품목 자리가 비어 있으면 "신규"를 반환하고 품목을 추가하십시오. 그렇지 않으면, 품목의 자리가 품목에 의해 점유되어 있는지 확인하십시오. 그렇다면 "새것이 아닙니다"를 반환하십시오. 스팟이 다른 항목에 의해 점유 된 경우 "new"를 반환하고 스팟을 새 항목으로 덮어 씁니다.

이전에 항목의 해시를 본 적이 없다면 항상 "신규"를 정확하게 얻을 수 있습니다. 동일한 항목을 볼 때 항목의 해시 만 본 경우 항상 "새 항목이 아님"으로 표시됩니다. 정답이 "신규 아님"일 때 "신규"를 얻는 유일한 경우는 항목 A를 본 다음 항목 B를 본 다음 항목 A를 다시보고 A와 B를 모두 해시하는 것입니다. 중요하게도 "신규 아님"을 잘못받을 수는 없습니다.


1
블룸 필터는 실제로 버킷 당 비트 만 필요하기 때문에 공간 효율 문제를 무시하거나 블룸 필터보다 효율이 훨씬 떨어진다고 가정합니다. 항목을 나타냅니다. 음 .. 우주가 유한하지 않으면 (Wandering Logic의 대답에서와 같이) 블룸 필터의 공간 효율성에 매우 가깝지 않을 것입니다.
Patrick87

개인적으로, 나는 당신의 대답이 나의 것보다 훨씬 낫다고 생각합니다. 확률을 50 %보다 개선하려는 경우 블룸 필터는 버킷 당 비트 가 아닙니다 . 또한 크기가 고정되어 있으며 절반 이상 채워지면 오 탐지 확률이 급격히 증가합니다. 편리한 확장 방법, 캐시로 사용하는 편리한 방법 및 요소를 삭제하는 편리한 방법은 없습니다. 매번 해시 테이블을 가져갑니다 .
방황 논리

@WanderingLogic 단일 비트 대신 작은 포화 카운터를 사용하면 삭제를 지원할 수 있습니다 (카운터 비용이 최대가 아닌 경우에만).
Paul A. Clayton

4

항목의 유니버스가 유한 한 경우 예 : 집합에있는 것이 아니라 집합에있는 요소를 기록하는 블룸 필터를 사용하십시오. (즉, 관심 집합의 보수를 나타내는 블룸 필터를 사용하십시오.)

이것이 유용한 장소는 제한된 형태의 삭제를 허용하는 것입니다. 두 개의 블룸 필터를 유지합니다. 그들은 빈 시작합니다. 요소를 삽입 할 때 블룸 필터 A에 요소를 삽입합니다. 나중에 요소를 삭제하려면 해당 요소를 블룸 필터 B에 삽입합니다. 삭제를 취소 할 방법이 없습니다. 조회를 수행하려면 먼저 블룸 필터 A에서 조회합니다. 일치하는 항목이 없으면 항목이 삽입되지 않은 것입니다 (확률 1). 일치하는 항목을 찾으면 요소가 삽입되었거나 삽입되지 않았을 수 있습니다. 이 경우 블룸 필터 B에서 조회를 수행합니다. 일치하는 항목이 없으면 항목이 삭제되지 않습니다. 블룸 필터 B에서 일치하는 항목을 찾으면 항목이 삽입 된 후 삭제 된 것입니다.

이것은 실제로 귀하의 질문에 대한 답변은 아니지만,이 제한된 경우 블룸 필터 B는 귀하가 찾고있는 "블룸 방지 필터"동작을 정확하게 수행합니다.

Real Bloom 필터 연구자들은 삭제를 표현하는 데 훨씬 더 효율적인 방법을 사용 합니다 . Mike Mitzenmacher의 간행물 페이지를 참조하십시오 .


이 질문에서 우리는 항목을 처리하고 있으며 삭제는 없습니다. 블룸 필터에서 항목을 제거하지 않고 칭찬을 저장하는 의미있는 방법은 없습니다
Joe

1
@ 조 : 나는 문제가 일반적으로 녹지 않기 때문에 보완이 유한하고 작은 경우에 대한 대답을 제한했습니다.
방황 논리

1

운 좋게도 상황에 처해 있다면 여러분이 볼 수있는 모든 값 를 알고 있다는 것을 여기에 추가하고 싶습니다 . 카운팅 블룸 필터를 사용할 수 있습니다.vi

예를 들어 ip-addresses가있을 수 있으며, 이전에 본 적이없는 것으로 보일 때마다 알고 싶습니다. 그러나 여전히 유한 한 세트이므로 예상 할 수있는 것을 알고 있습니다.

실제 솔루션은 간단합니다.

  1. 계산 항목 필터에 모든 항목을 추가하십시오.
  2. 새 항목이 표시되면 모든 슬롯에 값이 있습니다 .1
  3. 실제 새 항목을 본 후 필터에서 빼십시오.

따라서 실제로 오래되었지만 새로운 것으로 인식되는 '거짓 긍정'값이있을 수 있습니다. 그러나 새로운 가치에 대해서는 결코 새로운 것이 아닙니다. 그 가치는 여전히 모든 슬롯에 있으며, 아무도 그것을 빼앗을 수 없었기 때문입니다.

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