C++寻位映射的究极密码:哈希扩展

06-02 1179阅读

文章目录

  • 1.位图
    • 1.1 位图的结构
    • 1.2 位图映射的比特位标记成1
    • 1.3 位图映射的比特位标记成0
    • 1.4 位图映射判断为1 or 0
    • 2.布隆过滤器
      • 2.1 布隆过滤器的结构
      • 2.2 布隆过滤器的哈希函数
      • 2.3 布隆过滤器的插入
      • 2.4 布隆过滤器映射判断为true or false
      • 2.5 布隆过滤器的优缺点
      • 3.常见面试题
        • 3.1 哈希切割
          • 3.1.1 问题一
          • 3.1.2 问题二
          • 3.2 位图应用
            • 3.2.1 问题一
            • 3.2.2 问题二
            • 3.2.3 问题三
            • 3.3 布隆过滤器应用
              • 3.3.1 问题一
              • 3.3.2 问题二
              • 希望读者们多多三连支持
              • 小编会继续更新
              • 你们的鼓励就是我前进的动力!

                位图和布隆过滤器是基于哈希的一种常见应用,通常用来处理大体量数据,提升查找数据的效率

                1.位图

                给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?

                放在哈希表中去寻找?不,这并不现实,因为哈希表的存储也是需要空间消耗的,况且是 40 亿个数据,如此庞大的数据计算机一般是很难存储

                因此就诞生了位图的概念,位图简单来说就是把每个数按照哈希函数的计算,存储到每个比特位上。数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为 1,代表存在,为 0 代表不存在

                C++寻位映射的究极密码:哈希扩展

                1.1 位图的结构

                template
                class bitset
                {
                public:
                	bitset()
                	{
                		_a.resize(N / 32 + 1);
                	}
                private:
                	vector _a;
                };
                

                开辟一个 vector 数组 _a,这里我们以 int 作为位图的基本单位,那么就是把每个数据存储到 int 的比特位上

                🔥值得注意的是: resize 的时候无论如何都要加 1,比如 100 个数据,除以 32,等于 3,余 4,那么就需要多一个 int 空间来存储,不能说每次都卡好刚好 32 整除

                1.2 位图映射的比特位标记成1

                // x映射的那个标记成1
                void set(size_t x)
                {
                	size_t i = x / 32;
                	size_t j = x % 32;
                	_a[i] |= (1 
                	size_t i = x / 32;
                	size_t j = x % 32;
                	_a[i] &= (~(1 
                	size_t i = x / 32;
                	size_t j = x % 32;
                	return _a[i] & (1 
                private:
                    bitset
                    size_t operator()(const string& str)
                    {
                        size_t hash = 0;
                        for (auto ch : str)
                        {
                            hash = hash * 131 + ch;
                        }
                        //cout 
                    size_t operator()(const string& str)
                    {
                        size_t hash = 0;
                        for (size_t i = 0; i 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码