【C++ 哈希应用】

文章目录

  • 位图
    • 概念
    • 代码实现
    • 海量数据处理
  • 布隆过滤器
    • 概念
    • 代码实现
    • 海量数据处理
  • 哈希切割海量数据处理

位图

概念

一个值在给定的集合中有两种状态,在或不在,要表示这种状态,最少可以用一个比特位,比特位为1表示在,比特位为0表示不在。
位图中的比特位的位置表示编号,比特位的内容表示是否存在。

代码实现

	template<size_t N>class bitset{public:bitset():_bits(N / 32 + 1){}//设置某一位为1void set(size_t pos){size_t x = pos / 32;size_t y = pos % 32;_bits[x] |= (1 << y);}//设置某一位为0void reset(size_t pos){size_t x = pos / 32;size_t y = pos % 32;_bits[x] &= ~(1 << y);}//检测某一位的值bool test(size_t pos){size_t x = pos / 32;size_t y = pos % 32;return _bits[x] & (1 << pos);}private:vector<int> _bits;};

海量数据处理

  1. 给定100亿个整数,设计算法找到只出现一次的整数?
    使用两个位图标记出现的次数,(0, 0)表示出现0次,(0, 1)表示出现1次,(1,0)表示出现了两次及以上。
  2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
    整形最多有UINT_MAX个数,按照一个数一个比特位来算,差不多需要512MB,所以只需要使用两个位图标记出现的次数,最后依次遍历每一位,如果都为1,就是交集
  3. 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数?
    结合题1和题2的思路,用1G内存创建两个位图,(0, 0)表示出现0次,(0, 1)表示出现1次,(1,0)表示出现了两次及以上。

布隆过滤器

概念

位图的位置表示编号,内容表示是否存在这个值。那如果我们想用位图来标示某一个字符串的存在呢,我们可以用字符串hash函数将字符串转换为对应的整型值,但是这个hash值可能会产生冲突。这时,有人提出一种思路,既然一个hash函数不能标定一个字符串是否存在,那么如果字符串用多个字符串hash函数映射在位图中,如果一个字符串的所有hash值在位图中都存在(对应值为1),也不能肯定这个字符串真的存在,但如果有一个hash值在位图中不存在(对应值为0),那么可以肯定这个字符串一定不存在
通过加入更多的字符串hash函数,可以使得每个字符串即使冲突,也可以通过找不在位图中的hash值来快速判断一个字符串一定不存在
注意:布隆过滤器一般不提供删除接口,因为删除之后可能存在冲突

代码实现

template<size_t N, class HashFun1 = BKDRHash, class HashFun2 = APHash, class HashFun3 = DJBHash>
class BloomFilter
{
public:BloomFilter():_bs(new bitset<N>){}void set(const string& s){size_t hash1 = HashFun1()(s) % N;_bs->set(hash1);size_t hash2 = HashFun2()(s) % N;_bs->set(hash2);size_t hash3 = HashFun3()(s) % N;_bs->set(hash3);}bool test(const string& s){size_t hash1 = HashFun1()(s) % N;if (!_bs->test(hash1))return false;size_t hash2 = HashFun2()(s) % N;if (!_bs->test(hash2))return false;size_t hash3 = HashFun3()(s) % N;if (!_bs->test(hash3))return false;return true;}private:bitset<N>* _bs;
};

海量数据处理

  1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法
    近似算法:使用布隆过滤器,将一个文件映射到布隆过滤器中,再遍历另一个文件,查找是否存在布隆过滤器中。这种方法存在误判。
    精确算法:哈希切分使用统一的字符串hash函数,分别将两个文件的所有字符串转换为对应的hash值,对于其中一个文件,创建N 个小文件,假设N = 10000,用字符串hash值 % N,最终将字符串写入对应的文件中,另一个文件也是同样的操作,这样相同的query一定会进入到相同编号的文件中,最后将相同编号的文件读入内存中,用set进行求交集。
    如果文件太大,有两种可能:a.文件中重复query太多,此时不需要处理,set自动去重 b.文件中不同的query太多,这是可以换一个字符串hash函数,再创建文件,将字符串映射到不同的文件中,进行操作。
  2. 如何扩展BloomFilter使得它支持删除元素的操作?
    每个位位置上不再存储比特位,而是存储一个整形,当插入一个元素时,将其映射到的位的位置上的计数器加一;当删除一个元素时,将其映射到的位的位置上的计数器减一。

哈希切割海量数据处理

给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
哈希切分使用统一的字符串hash函数,分别将两个文件的所有字符串转换为对应的hash值,对于其中一个文件,创建N 个小文件,假设N = 1000,用字符串hash值 % N,最终将字符串写入对应的文件中,另一个文件也是同样的操作,这样相同的IP一定会进入到相同编号的文件中,最后将相同编号的文件读入内存中,用map进行记数求出出现次数最多的IP地址
如果文件太大,有两种可能:a.文件中重复IP太多,此时不需要处理,map自形解决即可 b.文件中不同的IP太多,这是可以换一个字符串hash函数,再创建文件,将字符串映射到不同的文件中,进行操作。
与上题条件相同,如何找到top K的IP?
维护一个小根堆即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【简单介绍下单片机】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

大学生简历大赛演讲稿(6篇)

大学生简历大赛演讲稿&#xff08;6篇&#xff09; 以下是六篇大学生简历大赛演讲稿的范文&#xff0c;供您参考&#xff1a; 范文一&#xff1a;展现真我&#xff0c;点亮未来 尊敬的评委、亲爱的同学们&#xff1a; 大家好&#xff01; 今天&#xff0c;我站在这里&#xf…

open-webui与ollama的部署最后完整之命令

docker run -d --networkhost -v open-webui:/app/backend/data -e HF_ENDPOINThttps://hf-mirror.com -e OLLAMA_BASE_URLhttp://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main -e HF_ENDPOINThttps://hf-mirror.com 一定要加上&a…

【C++】:C++关键字,命名空间,输入输出,缺省参数

目录 一&#xff0c;C关键字(C98)二&#xff0c;命名空间2.1 命名冲突2.2 关键字namespace2.2.1 命名空间中可以定义变量/函数/类型2.2.2 命名空间可以嵌套2.2.3 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。 2.3 命名空间的使用2.3.1 指定…

剑指offer之牛客与力扣——前者分类题单中的题目在后者的链接

搜索 [4.12完成] JZ1 LCR 172. 统计目标成绩的出现次数 JZ3 153. 寻找旋转排序数组中的最小值 JZ4 LCR 014. 字符串的排列 JZ5 LCR 163. 找到第 k 位数字 400 动态规划 [4.15完成] JZ2 LCR 161. 连续天数的最高销售额 53 JZ3 LCR 127. 跳跃训练 70 JZ4 LCR 126. 斐波那契…

笔记:编写函数,接收整数参数t,返回斐波那契数列中大于t的第1个数。

文章目录 前言一、斐波那契数列是什么&#xff1f;二、编写代码1.代码2.优化代码 总结 前言 题目&#xff1a;编写函数&#xff0c;接收整数参数t&#xff0c;返回斐波那契数列中大于t的第1个数。 在编写函数之前&#xff0c;我们首先需要了解一下斐波那契数列是什么。 一、斐…

gemini国内怎么用

gemini国内怎么用 Google Gemini 作为一个尚处于研发阶段的大型语言模型&#xff0c;其具体功能和性能尚未公开&#xff0c;因此无法对其好用程度做出明确评价。 然而&#xff0c;基于 Google 在人工智能领域的领先地位和技术实力&#xff0c;我们可以对其潜力进行一些推测&a…

【xgboost】使用xgboost训练一个简单模型

使用pandas读取特征数据&#xff0c;并处理数据中的双引号 使用xgboost训练一版模型 xgboost1.6.2 #!/usr/bin/env python # -*- coding:utf-8 -*- import pandas as pd import numpy as np from sklearn.model_selection import train_test_split import xgboost as xgb impor…

你不知道的JavaScript---深入理解 JavaScript 中的 this 关键字

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 在 JavaScript …

大型网站系统架构演化实例_4.数据库读写分离

1.数据库读写分离 网站在使用缓存后&#xff0c;使对大部分数据读操作访问都可以不通过数据库就能完成&#xff0c;但是仍有一部分操作&#xff08;缓存访问不命中、缓存过期&#xff09;和全部的写操作都需要访问数据库&#xff0c;在网站的用户达到一定规模后&#x…

Dockerfile CMD、ENTRYPOINT 区别

ENTRYPOINT与CMD都可以对iamge配置启动命令。但两者之间还是有一些细微的区别。多数情况下需要用户在二者中选择其一使用&#xff0c;但也可以共同使用两者。下面将具体分析二者不同的使用场景。 ENTRYPOINT or CMD 最终&#xff0c;ENTRYPOINT与CMD都提供了一个方法&#xff0…

通过实例学C#之ArrayList

介绍 ArrayList对象可以容纳若干个具有相同类型的对象&#xff0c;那有人说&#xff0c;这和数组有什么区别呢。其区别大概可以分为以下几点&#xff1a; 1.数组效率较高&#xff0c;但其容量固定&#xff0c;而且没办法动态改变。 2.ArrayList容量可以动态增长&#xff0c;但…

ros1中python3包调用自定义.py文件

ros中python包相互import不成功问题 问题解决办法 问题 在ros工程中&#xff0c;运行python文件难以直接import自己写的py文件&#xff0c;相互之间无法import&#xff0c;但是在python3虚拟环境python *.py文件就可以正常运行&#xff01; 注意这里还有个问题&#xff0c;我…

❤️‍FlyFlow工作流周更来咯~~

FlyFlow 借鉴了钉钉与飞书的界面设计理念&#xff0c;致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 BPMN.js 的工作流引擎&#xff0c;我们提供的解决方案显著简化了操作逻辑&#xff0c;使得用户能够在极短的时间内构建定制化的业务流程&#xff0c;即便…

前端近7天,近半个月,近1个月,近1年的日期处理

前端如何获取近7天,近1年的日期进行查询? methods:{//近7天getRangeDate(ranges) {let nowDays new Date();let getYear nowDays.getFullYear();let getMonth nowDays.getMonth() 1;let getDate nowDays.getDate();let nd new Date();nd nd.valueOf();nd nd - ranges…

记录汇川:五个ST案例

起保停&#xff1a; 简单数学教学&#xff1a; 数据查找&#xff1a; 按钮检测&#xff1a; 数据堆栈&#xff1a;

【k8s】:kubectl 命令设置简写启用自动补全功能

【k8s】:kubectl 命令设置简写&启用自动补全功能 1、设置kubectl命令简写2、启用kubectl自动补全功能💖The Begin💖点点关注,收藏不迷路💖 Kubernetes(K8s)是一个强大的容器编排平台,而kubectl则是与之交互的命令行工具。尽管Kubernetes提供了强大的功能,但有时…

wiringpi库的应用 -- sg90 定时器 oled

sg 90舵机: 接线: VCC -- 红 GND -- 地 信号线 -- 黄 -- pwm 定时器: 先玩定时器: sg90 需要的pwm波需要定时器输出&#xff0c;so我们得先来玩一下定时器 分析&#xff1a;实现定时器&#xff0c;通过itimerval结构体以及函数setitimer产生的信号&#xff0c;系统…

python装饰器系列教程(1)

若为了与用户交互&#xff0c;有如下代码 def messageOne():print("今天天气是晴转多云")def messageTwo():print("今天的空气质量为优")messageOne() messageTwo()现需在每条提示信息之前加上一条关于客户来自中国的信息&#xff0c;可改写为 def messa…

快手本地生活服务商系统怎么操作?

当下&#xff0c;抖音和快手两大短视频巨头都已开始布局本地生活服务&#xff0c;想要在这一板块争得一席之地。而这也很多普通人看到了机遇&#xff0c;选择成为抖音和快手的本地生活服务商&#xff0c;通过将商家引进平台&#xff0c;并向其提供代运营服务&#xff0c;而成功…