블 룸 필터 (Bloom Filter) 의 원리 와 구현
먼저 비교적 흔히 볼 수 있 는 몇 가지 예 를 살 펴 보 자.
일반적인 사고 방식.
해시 함수
해시 함수 의 개념 은 임의의 크기 의 데 이 터 를 특정 크기 의 데이터 로 변환 하 는 함수 이 며, 변 환 된 데 이 터 를 해시 값 이나 해시 인 코딩 이 라 고 합 니 다.다음은 설명도 입 니 다.
원시 데 이 터 는 해시 함수 의 매 핑 을 거 친 후에 하나의 해시 인 코딩 이 라 고 부 르 고 데 이 터 는 압축 된 것 을 뚜렷하게 볼 수 있다.해시 함 수 는 해시 표 와 부 릉 필 터 를 실현 하 는 기초 입 니 다.
부 릉 필터 소개
블 룸 필터 (Bloom Filter) 의 핵심 실현 은 엄 청 난 자릿수 그룹 과 몇 개의 해시 함수 입 니 다.비트 배열 의 길이 가 m 이 고 해시 함수 의 개 수 는 k 라 고 가정 합 니 다.
상기 그림 을 예 로 들 면 구체 적 인 조작 절차: 집합 안에 3 개의 원소 {x, y, z} 가 있다 고 가정 하면 해시 함수 의 개 수 는 3 이다.우선 비트 배열 을 초기 화하 고 안에 있 는 모든 비트 를 0 으로 설정 합 니 다.집합 안의 모든 요소 에 대해 원 소 를 3 개의 해시 함 수 를 통 해 차례대로 매 핑 합 니 다. 매 핑 할 때마다 해시 값 이 생 깁 니 다. 이 값 은 비트 배열 위의 한 점 에 대응 한 다음 에 비트 배열 에 대응 하 는 위 치 를 1 로 표시 합 니 다.W 요소 가 집합 에 있 는 지 확인 할 때 같은 방법 으로 W 를 해시 를 통 해 자릿수 그룹의 3 개 점 에 투사 합 니 다.만약 세 개의 점 중 하나 가 1 이 아니라면 이 요 소 는 반드시 집합 에 존재 하지 않 는 다 고 판단 할 수 있다.반대로 세 개의 점 이 모두 1 이면 이 요 소 는 집합 에 존재 할 수 있다.주의: 이 요소 가 반드시 집합 에 존재 하 는 지 판단 할 수 없고 어느 정도 오심 율 이 있 을 수 있 습 니 다.그림 에서 볼 수 있 듯 이 특정한 요소 가 맵 을 통 해 아래 에 4, 5, 6 이라는 세 가지 점 으로 표시 된다 고 가정 할 수 있다.이 세 가지 점 은 모두 1 이지 만 이 세 가지 점 은 서로 다른 요소 가 하 쉬 를 거 쳐 얻 은 위치 임 이 분명 하 다. 따라서 이런 상황 은 요소 가 집합 에 있 지 않 지만 대응 하 는 것 이 모두 1 일 수도 있다 는 것 을 설명 한다. 이것 은 오심 율 이 존재 하 는 원인 이다.
부 릉 필터 추가 요소
부 릉 필터 조회 요소
다음은 python 의 실현 을 보 여 줍 니 다. murmurhash 알고리즘 을 사용 하 십시오.
import mmh3from bitarray import bitarray# zhihu_crawler.bloom_filter# Implement a simple bloom filter with murmurhash algorithm.# Bloom filter is used to check wether an element exists in a collection, and it has a good performance in big data situation.# It may has positive rate depend on hash functions and elements count.BIT_SIZE = 5000000class BloomFilter:
def __init__(self):
# Initialize bloom filter, set size and all bits to 0
bit_array = bitarray(BIT_SIZE)
bit_array.setall(0) self.bit_array = bit_array
def add(self, url):
# Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
# Here use 7 hash functions.
point_list = self.get_postions(url) for b in point_list: self.bit_array[b] = 1
def contains(self, url):
# Check if a url is in a collection
point_list = self.get_postions(url)
result = True
for b in point_list:
result = result and self.bit_array[b]
return result def get_postions(self, url):
# Get points positions in bit vector.
point1 = mmh3.hash(url, 41) % BIT_SIZE
point2 = mmh3.hash(url, 42) % BIT_SIZE
point3 = mmh3.hash(url, 43) % BIT_SIZE
point4 = mmh3.hash(url, 44) % BIT_SIZE
point5 = mmh3.hash(url, 45) % BIT_SIZE
point6 = mmh3.hash(url, 46) % BIT_SIZE
point7 = mmh3.hash(url, 47) % BIT_SIZE return [point1, point2, point3, point4, point5, point6, point7]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Cognos Analytics 11.0.7 새로운 기능 - 인터랙티브 필터Cognos Analytics 11.0.7의 새로운 기능을 흥미로운 순서대로 살펴보고 소개합니다. 이번에는 보고서 기능의 새로운 기능 인 "대화 형 필터"의 기능입니다. 보고서의 HTML 실행 후 화면에서 최종 사용...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.