Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有没有一种方法可以根据这个实现给出的启发式定理来确定m?_Algorithm_Bloom Filter - Fatal编程技术网

Algorithm 有没有一种方法可以根据这个实现给出的启发式定理来确定m?

Algorithm 有没有一种方法可以根据这个实现给出的启发式定理来确定m?,algorithm,bloom-filter,Algorithm,Bloom Filter,Bloom提出了一种应用技术,如果应用“传统的”无错误散列技术,那么大量的源数据将需要大量不切实际的内存。他举了一个50万字字典的断字算法的例子,其中90%遵循简单的断字规则,但其余10%需要昂贵的磁盘访问来检索特定的断字模式 public class BloomFilter { int m; int k; HashSet<String> map = new HashSet<>(); public BloomFilter(){

Bloom提出了一种应用技术,如果应用“传统的”无错误散列技术,那么大量的源数据将需要大量不切实际的内存。他举了一个50万字字典的断字算法的例子,其中90%遵循简单的断字规则,但其余10%需要昂贵的磁盘访问来检索特定的断字模式

public class BloomFilter {
    int m;
    int k;
    HashSet<String> map = new HashSet<>();
    public BloomFilter(){
        int c = 100;
        float e = 0.1f;
        m = (int) Math.floor(  -1 * c * Math.log(e) / (Math.log(2)*Math.log(2)) ) + 1;
        k = (int) Math.floor( 0.7 * m / (float) c ) + 1;
    }
    private static int[] createHashes(String key, int hashes, int m) {
    byte[] data = key.getBytes();
    int[] result = new int[hashes];

    MessageDigest digestFunction;
    try {
        digestFunction = MessageDigest.getInstance("MD5");
    } catch (Exception e) {
        throw new RuntimeException();
    }

    int k = 0;
    byte salt = 0;
    while (k < hashes) {
        byte[] digest;

        digestFunction.update(salt);
        salt++;
        digest = digestFunction.digest(data);                

        for (int i = 0; i < digest.length / 4 && k < hashes; i++) {
            int h = 0;
            for (int j = (i * 4); j < (i * 4) + 4; j++) {
                h <<= 8;
                h |= ((int) digest[j]) & 0xFF;
            }
            result[k] = Math.abs(h % m);
            k++;
        }
    }
    return result;
    }
    public void add(String s){
        map.add(Arrays.toString(createHashes(s, k, m)));
    }
    public boolean contains(String s){
        return map.contains(Arrays.toString(createHashes(s, k, m)));
    }
}
公共类过滤器{
int m;
int k;
HashSet map=新的HashSet();
公共过滤器(){
int c=100;
浮球e=0.1f;
m=(int)数学层(-1*c*Math.log(e)/(Math.log(2)*Math.log(2))+1;
k=(int)数学地板(0.7*m/(浮动)c)+1;
}
私有静态int[]createHashes(字符串键,int散列,int m){
byte[]data=key.getBytes();
int[]结果=新的int[散列];
消息摘要功能;
试一试{
digestFunction=MessageDigest.getInstance(“MD5”);
}捕获(例外e){
抛出新的RuntimeException();
}
int k=0;
字节salt=0;
while(k<散列){
字节[]摘要;
功能更新(salt);
salt++;
摘要=摘要函数。摘要(数据);
for(int i=0;i
m=-(n lnp)/((ln2)^2)

这意味着对于给定的误报概率p,Bloom过滤器的长度m与被过滤的元素数量n成比例[5],而上述公式是渐近的(即适用于m,n→ ∞), 与m,n的有限值的一致性也很好

因此m—提交的比特数,基于所需的错误率。

From

m=-(n lnp)/((ln2)^2)

这意味着对于给定的误报概率p,Bloom过滤器的长度m与被过滤的元素数量n成比例[5],而上述公式是渐近的(即适用于m,n→ ∞), 与m,n的有限值的一致性也很好


因此,m—提交的位数是基于所需的误码率。

谢谢,但这并不是严格正确的,因为它假设设置的每个位的概率都是独立的。但是,假设这是一个近似值,则误报概率会随着m(数组中的位数)的减少而降低增加,并随着n(插入的图元数)的增加而增加增加。最佳bloom筛选器为50%集。高质量哈希算法应能保证这一点,但这并不是严格正确的,因为它假设设置的每个位的概率独立。但是,假设这是一个近似值,则误报概率降低为m(数组中的位数)增加,并随着n(插入元素的数量)的增加而增加。最佳布卢姆过滤器设置为50%。高质量的哈希算法应保证这一点