首页 > 其他分享 >布隆过滤器

布隆过滤器

时间:2022-09-24 22:13:40浏览次数:37  
标签:std count hash string int 布隆 key 过滤器

布隆过滤器

面试被问到了海量数据处理相关的问题。然后发现了布隆过滤器这个数据结构,学了一下,结果就是这是acm里面用过的算法。
我把布隆过滤器分解为两个模块,也就是多次哈希+bitset
多次哈希用来优化时间,bitset优化了空间。

时间复杂度上的原理

我们想想哈希这个算法有什么有什么缺点?当然是哈希冲突。
哈希冲突是无法避免的,所以我们得想个法子降低发生哈希冲突的概率。

我们假设现在有\(n\)种算法某一种哈希算法发生冲突的概率为\(p_i\),那么对于一组数据我们把\(n\)种算法全用上。那发生冲突的概率是多少?所有概率之积,这样的话冲突的概率就大大降低了。

空间复杂度上的优化

布隆过滤器可以高效的检验出某一数据是否在海量数据集合中。而在或者不在是两种状态,我们可以用一个bool数组存一下,C++中的bool是1个字节8位的,这已经很不错了。但是C++提供了更好的容器——bitset。它只需要1位。
这种用法就是网上常说的位图。

衍生:如果我们想要求出现2次的数据怎么办?用两个bitset。10表示出现两次,11表示出现三次及三次以上。

代码

现在这个代码就极为清晰了。

class BloomFilter{
public:
    std::bitset<32> bits;
public:
    void set(std::string& key){
        for(int i = 1;i < 5;i++){
            bits[Hash(i,key)] = 1;
        }
    }
    bool isExist(){
        bool ok = true;
        for(int i = 1;i < 5;i++){
            ok &= bits[Hash(i,key)];
        }
    }
    int Hash(int id,std::string key){
        if(id == 1){
            return Hash1(key);
        }
        else if(id == 2){
            return Hash2(key);
        }
        else if(id == 3){
            return Hash3(key);
        }
        else if(id == 4){
            return Hash4(key);
        }else{
            return -1;
        }
    }
    int Hash1(std::string& key)
    {
        int seed = 131;
        int hash = 0;
        std::string str = key + "key2";
        unsigned long count = str.size();
        while(count > 0) {
            hash = hash * seed + str[str.size() - count];
            count--;
        }
        return (hash & 0x7FFFFFFF) % bits.size();
    }

    int Hash3(std::string& key)
    {
        int hash = 0;
        std::string str = key + "keykey3";
        unsigned long count = str.size();
        for (int i = 0; i < count; i++) {
            if ((i * 1) == 0) {
                hash ^= ((hash << 7) ^ (str[i] ^ hash >> 3));
            } else {
                hash ^= (~((hash << 11) ^ (str[i]) ^ (hash >> 5)));
            }
            count--;
        }
        return (hash & 0x7FFFFFFF) % bits.size();
    }
    
    int Hash4(std::string key)
    {
        int hash = 5381;
        std::string str = key + "keykeykey4";
        unsigned long count = str.size();
        while(count > 0) {
            hash += (hash << 5) + (str[str.size() - count]);
            count--;
        }
        return (hash & 0x7FFFFFFF) % bits.size();
    }
};

标签:std,count,hash,string,int,布隆,key,过滤器
From: https://www.cnblogs.com/Paranoid5/p/16726783.html

相关文章

  • vue3配置全局过滤器
    vue3配置全局过滤器需要在main.js中配置一下代码//vue3配置全局过滤器app.config.globalProperties.$filters={//formatTime过滤器的名称formatTime(value:s......
  • Qt 事件过滤器
    目录分析代码一、控件安装事件过滤器二、在过滤器中实现事件过滤事件效果总结 分析现在有这样一个场景,界面中有三个按钮,分别实现三个按钮对应槽函数,正......
  • 十分钟理解布隆过滤器
    首先我们要先了解什么是布隆过滤器?布隆过滤器(BloomFilter)是由Bloom于1970年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分......
  • 拦截器和过滤器的区别
    拦截器和过滤器的区别1.过滤器是servlet中的对象,拦截器是框架中的对象2.过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor3.过滤器是用来设置request,respo......
  • 【django学习-11】模板3:自定义标签与过滤器
    前言:Django虽然内置了二十多种标签和六十多种过滤器,但是为了给Web开发者提供更好使用体验,Django也提供了自定义标签与过滤器的功能。当内置标签与过滤器满足不了实际......
  • 小程序 : wxs语法基本使用 -- 类似于过滤器
    第一步,创建wxs并导出functionformatPrice(price){return"¥"+price}functioncalcPrice(books){return"¥"+books.reduce(function(preValue,item)......
  • 模板语法之过滤器
    过滤器的作用用来修改变量的输出结果语法{{变量名|过滤器1:'参数值1’|过滤器2:'参数值2}}<h1>过滤器</h1><p>统计长度:{{s|length}}</p><p>默认值(第一个参数b布尔......
  • Vue-过滤器
    过滤器filter主要用于数据展示之前的处理 过滤器只能用在v-bind或者插值表达式中<body> <divid="app"> <h2>{{data1}}</h2> <inputv-model="data2"......
  • 过滤器和拦截器的使用
    过滤器和拦截器的使用拦截器应用场景拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:登录验证,判断用户是否登录。权......
  • MVC过滤器-权限过滤器
    这几天有个问题一直困扰着我,就是我们常用的项目中的登录,在几乎所有平台上都需要用户注册账号,有了账号才能登录从而使用我们所开发出来的各种平台,就是这个后台的权限过滤器,......