블룸 필터
블룸 필터(Bloom filter)는 원소가 집합에 속하는지 여부를 검사하는데 사용되는 확률적 자료 구조이다. 1970년 Burton Howard Bloom에 의해 고안되었다. 블룸 필터에 의해 어떤 원소가 집합에 속한다고 판단된 경우 실제로는 원소가 집합에 속하지 않는 긍정 오류가 발생하는 것이 가능하지만, 반대로 원소가 집합에 속하지 않는 것으로 판단되었는데 실제로는 원소가 집합에 속하는 부정 오류는 절대로 발생하지 않는다는 특성이 있다. 집합에 원소를 추가하는 것은 가능하나, 집합에서 원소를 삭제하는 것은 불가능하다. 집합 내 원소의 숫자가 증가할수록 긍정 오류 발생 확률도 증가한다.
구조
[편집]블룸 필터는 비트 크기의 비트 배열 구조를 가진다. 또한 블룸 필터에서는 가지의 서로 다른 해시 함수를 사용하며, 각 해시 함수는 입력된 원소에 대해 가지의 값을 균등한 확률로 출력해야 한다.
블룸 필터는 집합에 원소를 추가하는 명령어와 원소가 속하는지를 검사하는 명령어를 지원한다. (원소를 삭제하는 명령어는 존재하지 않는다.)
- 원소를 추가하는 경우, 추가하려는 원소에 대해 가지의 해시 값을 계산한 다음, 각 해시 값에 대응하는 비트를 1로 설정한다.
- 원소를 검사하는 경우, 해당 원소에 대해 가지의 해시 값을 계산한 다음, 각 해시 값에 대응하는 비트값을 읽는다. 모든 비트가 1인 경우 속한다고 판단하며, 나머지는 속하지 않는다고 판단한다.
성질
[편집]블룸 필터의 원소 추가와 원소 검사에 걸리는 시간은 으로, 집합에 포함되어 있는 원소 수와 무관하다.
블룸 필터에서 원소를 검사할 때 없는 원소가 있다고 판단될 확률은 다음과 같이 구할 수 있다. 블룸 필터에 원소를 개 추가했을 때, 특정 비트가 0일 확률은 이다. 따라서 원소를 검사할 때 개의 해시값이 모두 1이 될 확률은 가 되며, 이 값은 대략적으로 가 된다.
비트 크기가 같은 두 블룸 필터의 합집합이나 교집합을 구하려면, 각 비트의 OR 연산이나 AND 연산을 구하면 된다. 이렇게 계산되는 새로운 블룸 필터는 원래의 합집합이나 교집합을 직접 계산한 것과 동일한 값을 가진다.
확장
[편집]카운팅 필터
[편집]카운팅 필터(Counting filter)는 블룸 필터에서 필터를 재생성하지 않고도 원소의 삭제가 가능하도록 변형된 것이다. 블룸 필터에서 배열 내 각 버켓의 크기가 1 비트였던 것을 카운팅 필터에서는 비트로 확장하여 카운터로 사용한다. 따라서 블룸 필터는 배열의 버켓 크기가 1 비트인 카운팅 필터라 할 수 있다. 카운팅 필터는 1998년 L. Fan 등에 의해 제안되었다.
카운팅 필터에서 원소를 추가하면 해당되는 버켓의 값을 1씩 증가시킨다. 원소 검색시에는 해당 위치가 0이 아닌지를 확인하여 판단하게 되며, 원소의 삭제시에는 버켓의 값을 1씩 감소시킨다.
카운팅 필터에서는 버켓 변수의 오버플로우가 발생할 수 있으므로, 버켓 변수는 이를 감안하여 충분히 큰 자료형이 사용되어야 한다. 오버플로우 상황이 발생한 경우, 블룸 필터의 성질을 유지하기 위해 원소의 추가 및 삭제시 해당 버켓의 값은 최댓값으로 설정하여야 한다.
카운터의 크기는 일반적으로 3 또는 4 비트이다. 따라서 카운팅 블룸 필터는 기존의 정적 블룸 필터보다 3~4배 더 많은 메모리 공간을 사용하게 된다. 이론적으로 카운팅 블룸 필터와 동일한 수준으로 최적화 된 자료 구조는 정적 블룸 필터가 사용하는 것과 같거나 혹은 그보다 더 적은 메모리 공간을 사용해야 한다.
카운팅 필터의 또 다른 약점은 낮은 확장성이다. 테이블의 크기가 고정되어 있으므로, 필터가 수용할 수 있는 최대 키 개수가 미리 알려져 있어야 한다. 테이블이 수용할 수 있는 범위를 넘어 키가 추가되기 시작하면, 긍정 오류 발생 확률이 빠르게 증가하게 된다.