Add Bloom Filter (#3042)
This commit is contained in:
parent
00c758a299
commit
f272d8a949
@ -0,0 +1,59 @@
|
||||
package com.thealgorithms.datastructures.bloomfilter;
|
||||
|
||||
|
||||
public class BloomFilter<T> {
|
||||
|
||||
private int numberOfHashFunctions;
|
||||
private int [] bitArray;
|
||||
private Hash<T>[] hashFunctions;
|
||||
|
||||
public BloomFilter(int numberOfHashFunctions, int n) {
|
||||
this.numberOfHashFunctions = numberOfHashFunctions;
|
||||
hashFunctions = new Hash[numberOfHashFunctions];
|
||||
bitArray = new int[n];
|
||||
insertHash();
|
||||
}
|
||||
|
||||
private void insertHash() {
|
||||
for (int i = 0; i < numberOfHashFunctions; i++) {
|
||||
hashFunctions[i] = new Hash(i);
|
||||
}
|
||||
}
|
||||
|
||||
public void insert(T key) {
|
||||
for (Hash<T> hash : hashFunctions){
|
||||
bitArray[hash.compute(key) % bitArray.length] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean contains(T key) {
|
||||
for (Hash<T> hash : hashFunctions){
|
||||
if (bitArray[hash.compute(key) % bitArray.length] == 0){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private class Hash<T> {
|
||||
|
||||
int index;
|
||||
|
||||
public Hash(int index){
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
public int compute(T key){
|
||||
return index * asciiString(String.valueOf(key));
|
||||
}
|
||||
|
||||
private int asciiString(String word){
|
||||
int number = 0;
|
||||
for (int i=0;i<word.length();i++){
|
||||
number += word.charAt(i);
|
||||
}
|
||||
return number;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.thealgorithms.datastructures.bloomfilter;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
public class BloomFilterTest {
|
||||
|
||||
@Test
|
||||
public void test1(){
|
||||
BloomFilter<Integer> bloomFilter = new BloomFilter<>(3,10);
|
||||
bloomFilter.insert(3);
|
||||
bloomFilter.insert(17);
|
||||
|
||||
Assertions.assertTrue(bloomFilter.contains(3));
|
||||
Assertions.assertTrue(bloomFilter.contains(17));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void test2(){
|
||||
BloomFilter<String> bloomFilter = new BloomFilter<>(4,20);
|
||||
bloomFilter.insert("omar");
|
||||
bloomFilter.insert("mahamid");
|
||||
|
||||
Assertions.assertTrue(bloomFilter.contains("omar"));
|
||||
Assertions.assertTrue(bloomFilter.contains("mahamid"));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user