[c++] 블룸 필터를 이용한 검색
블룸 필터는 확률적 집합 자료구조로, 어떤 요소가 집합에 속해 있는지 여부를 확률적으로 판단할 수 있습니다. 이는 검색을 보다 효율적으로 수행할 수 있도록 도와줍니다.
블룸 필터의 구조
블룸 필터는 보통 비트 배열 또는 비트 벡터로 구현됩니다. 비트 배열의 각 요소는 해시 함수를 통과한 후 특정 위치에 셋팅됩니다. 따라서, 블룸 필터는 입력된 요소가 집합에 있을 가능성을 보여줍니다.
#include <iostream>
#include <vector>
#include <bitset>
#include <functional>
class BloomFilter {
public:
BloomFilter(int size) : m_bits(size) {}
void add(const std::string& value) {
for (auto& hashFunction : m_hashFunctions) {
size_t index = hashFunction(value) % m_bits.size();
m_bits.set(index, true);
}
}
bool contains(const std::string& value) const {
for (auto& hashFunction : m_hashFunctions) {
size_t index = hashFunction(value) % m_bits.size();
if (!m_bits.test(index)) {
return false;
}
}
return true;
}
private:
std::vector<std::function<size_t(const std::string&)>> m_hashFunctions = {
std::hash<std::string>(),
[](const std::string& value) { return std::hash<std::string>{}(value + "salt"); }
};
std::bitset<1000> m_bits;
};
위 코드에서 BloomFilter
클래스의 add
함수는 입력된 문자열을 해시 함수를 통해 해시 값으로 변환한 뒤, 해당 인덱스를 찾아 참 값을 설정합니다. contains
함수는 입력된 문자열이 모든 해시 값을 갖고 있는지를 확인하여, 가능성을 판단합니다.
블룸 필터의 활용
블룸 필터는 대량의 데이터를 다룰 때 중복된 데이터를 신속하게 걸러내는 데에 효과적입니다. 예를 들어, 크롤러가 수집한 URL을 중복 확인할 때 블룸 필터를 사용하면 중복된 URL을 빠르게 걸러내어 처리할 수 있습니다.
불행히도, 블룸 필터는 오검출(거짓 양성)이 발생할 수 있습니다. 즉, 실제로는 존재하지 않는데 존재한다고 판단하는 경우가 발생할 수 있으므로 이러한 확률적 특성을 유의해야 합니다.
결론
블룸 필터는 확률적인 검색을 위한 유용한 자료구조로, 대량의 데이터 중에서 특정 요소가 존재하는지를 빠르게 확인할 수 있는 장점이 있습니다. 그러나 그 확률적 특성으로 인해 오검출이 발생할 수 있음을 유의해야 합니다.
이로써, 블룸 필터를 이용한 검색에 대한 간략한 소개를 마치겠습니다.