最新要闻
- 全球观热点:好客山东名不虚传!淄博0.85米志愿者喝着奶帮看行李
- 爱买不买?三星等国外大厂减产倒逼SSD等存储涨价 国产厂商不怕|焦点资讯
- 当前资讯!素质堪忧?垃圾站现1000万日元 日本12人前去冒领:最终结果意外
- 孔雀为躲游客拔毛被滑车碾压:为珍贵白孔雀!景区回应_全球速看
- 【世界报资讯】五一“赛程近半” 文娱及旅游等消费数据有多强劲?
- 全球百事通!家电行业周报:三大白电4月空冰洗排产数据较好
- 每日简讯:提前十一天!《塞尔达传说:王国之泪》意外偷跑:模拟器可玩
- 终于像是“次世代”了:微软为Xbox开发新版UI
- 高质量发展调研行丨产业集群提速 项目建设正酣-天天快资讯
- 五一返程注意!暴雨大暴雨要来了:华东、华中将现今年来最强降雨_环球快讯
- 世界微资讯!特斯拉差点破产:马斯克入选瑞典“失败博物馆”
- 曝小鹏“自动驾驶”避让大车险冲出高架 客服回应:会反馈核实|世界播资讯
- 时讯:失业潮或在路上!IBM计划用AI取代7800个岗位
- 环球观焦点:5月24开播!美版《西游ABC》来了:杨紫琼演观音 吴彦祖演美猴王
- 天天热头条丨傅欢俱乐部赛事达成200次出场,中超175场,中甲25场
- 频频把辅助驾驶当成自动驾驶:一嘴硬的理想车主撞了-全球热门
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
哈希表与布隆过滤器
(资料图)
一、哈希的整体思想
最简单的哈希表其实就是数组,从数组中取出一个数的时间复杂度是O(1)的。但是数组下标类型是整型的,万一我的下标类型不是整型了该怎么办呢?比如说字符串型,典型的就是我想查找某个单词存不存在。还有些更复杂的数据类型,比如自定义的类型。那么问题就来了,如何满足任意数据类型的索引需求呢?最简单直接的想法,其实就是先对任意数据类型与整型的数组下标做一个映射,往后就又回到数组取数的环节了。这种映射是一种高维空间到低维空间的映射。低维空间是有限的,而高维空间的变化情况要复杂得多。如果采用一个萝卜一个坑的思想,必然会产生重复占位,这就是哈希冲突。当我们在设计哈希表的时候一定要考虑到哈希冲突。为什么说哈希表的设计感极强,其实就在于,解决哈希冲突的方法是多种多样的。还有一个问题,哈希表装满了怎么办?有一个概念叫做装填因子(=存储元素数/哈希表size大小)一般来说,装填因子达到0.75的情况下,意味着哈希表可能要进行扩容了。
布隆过滤器
好了,说回布隆过滤器,传统哈希表有一个缺点,就是存储空间与元素数量有关,在大数据的场景下,经常需要判重操作。如果用一张哈希表存,数据量可能过于庞大。而布隆过滤器,可以实现存储空间与元素数量无关。它是通过几组不同的哈希函数,映射到不同的数组下标,然后在对应位置的数组上标记为1,默认是0,如果这些位置上的数组值一旦只要出现一个0,那么都可以直接判断出,该元素不存在,但是如果全为1,也不能说明它就一定存在哈希表中,只能说明它大概率存在。布隆过滤器经常应用于大数据和信息安全相关的场景中。
二、哈希冲突解决办法
1、开放地址法
思想:如果7的位置发生冲突了,那就试一试8,8也不行,那就试一试9,依次往后“探测”,直到找到空位。(线性探测法)注意:往后探测位置的计算规则是很灵活的,这里只是举了最简单的线性探测法。
平方探测法也有两种,可以简要看看找找区别,做题的时候格外注意,到底是哪一种:第一种:7->8->12->21->37 (a[i+1] = a[i] + i^2)第二种:7->8->11->16->23 (a[i+1] = a[0] + i^2)值得注意的是,第二种只需要判断 i 从0-Msize-1 即可,因为(key+Msize*Msize)%Msize代表搜索回到了原地,这时可以认为无法搜索到这个数字
2、再哈希法
思想:比方说可以设计三种不同的哈希函数,如果第一种冲突了,就试试第二种,第二种也冲突了就试试第三种,依次类推。注意:这种方法治标不治本,一般配合其他的哈希冲突解决方法使用。
3、建立公共溢出区
思想:另外建立一个公共溢出区,我想找的元素哈希表中找不到,就去公共溢出区再找找,其实就是用另外一种数据结构来维护,比方说红黑树。
4、链式地址法(拉链法)
思想:把哈希表的每一个坑看成链表的头节点。如果两个元素都想占用这个坑,直接在该坑上往后形成一个链表即可。
三、哈希表代码实现:
#include#includeusing namespace std;// 开放寻址法class HashTable {public: HashTable(int n = 100) : data(n), flag(n), cnt(0) {} void insert(string s) { int ind = hash_func(s) % data.size(); // 计算哈希值 recalc_ind(ind, s); // 冲突处理 if (!flag[ind]) { data[ind] = s; flag[ind] = true; cnt++; if (cnt * 100 > data.size() * 75) { expand(); } } } bool find(string s) { int ind = hash_func(s) % data.size(); // 计算哈希值 recalc_ind(ind, s); // 冲突处理 return flag[ind]; }private: int cnt; // 记录有多少元素 vector data; vector flag; // 记录相应位置是否存数据 void expand() { int n = data.size() * 2; HashTable h(n); for (int i = 0; i < data.size(); i++) { // 看似很高的时间复杂度,其实分摊到每一个元素,扩容所造成的时间复杂度是O(1)的。 if (flag[i] == false) continue; h.insert(data[i]); } *this = h; return ; } int hash_func(string &s) { int seed = 131, hash = 0; for (int i = 0; s[i]; i++) { hash = hash * seed + s[i]; } return hash & 0x7fffffff; // 最高位是0,最后肯定是一个正数 } void recalc_ind(int &ind, string s) { int t = 1; while (flag[ind] && data[ind] != s) { ind += t * t; t += 1; ind %= data.size(); } return ; }};// 公共溢出区法:class HashTable {public: HashTable(int n = 100) : flag(n), data(n), cnt(0) {} void insert(string s) { int ind = hash_func(s) % data.size(); // 计算哈希值 recalc_ind(ind, s); // 冲突处理 if (flag[ind] == false) { data[ind] = s; flag[ind] = true; cnt += 1; if (cnt * 100 > data.size() * 75) { expand(); } } else if (data[ind] != s) { buff.insert(s); } return ; } bool find(string s) { int ind = hash_func(s) % data.size(); // 计算哈希值 recalc_ind(ind, s); // 冲突处理 if (flag[ind] == false) return false; if (data[ind] == s) return true; return buff.find(s) != buff.end(); }private: int cnt; vector data; vector flag; set buff; void expand() { int n = data.size() * 2; HashTable h(n); for (int i = 0; i < data.size(); i++) { if (flag[i] == false) continue; h.insert(data[i]); } for (auto x : buff) { h.insert(x); } *this = h; return ; } int hash_func(string &s) { int seed = 131, hash = 0; for (int i = 0; s[i]; i++) { hash = hash * seed + s[i]; } return hash & 0x7fffffff; } void recalc_ind(int &ind, string &s) { return ; }};// 拉链法class Node {public : Node(string data = "", Node *next = nullptr) : data(), next(nullptr) {} string data; Node *next; void insert(Node *node) { node->next = this->next; this->next = node; return ; }};class HashTable {public: HashTable(int n = 100) : data(n), cnt(0) {} void insert(string s) { int ind = hash_func(s) % data.size(); // 计算哈希值 recalc_ind(ind, s); // 冲突处理 Node *p = &data[ind]; while (p->next && p->next->data != s) p = p->next; if (p->next == nullptr) { p->insert(new Node(s)); cnt += 1; if (cnt > data.size() * 3) expand(); } return ; } bool find(string s) { int ind = hash_func(s) % data.size(); // 计算哈希值 recalc_ind(ind, s); // 冲突处理 Node *p = data[ind].next; while (p && p->data != s) p = p->next; return p != nullptr; }private: int cnt; vector data; void expand() { int n = data.size() * 2; HashTable h(n); for (int i = 0; i < data.size(); i++) { Node *p = data[i].next; while (p) { h.insert(p->data); p = p->next; } } *this = h; return ; } int hash_func(string &s) { int seed = 131, hash = 0; for (int i = 0; s[i]; i++) { hash = hash * seed + s[i]; } return hash & 0x7fffffff; } void recalc_ind(int &ind, string &s) { return ; }};int main() { int op; string s; HashTable h; while (cin >> op >> s) { switch (op) { case 1: h.insert(s); break; case 2: cout << "find " << s << " : " << h.find(s) << endl; break; } } return 0;}
看到这里,不妨来一道PAT的题目练练手吧,PAT题目链接:https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805343236767744题解代码:
#include#include#includeusing namespace std;#define MAX_N 20000int Msize, n, m;int a[MAX_N + 5], flag[MAX_N + 5];int cnt;bool insert(int s) { if (cnt == Msize) return false; for (int t = 0; t < Msize; t++) { int ind = (s + t * t) % Msize; if (!flag[ind]) { a[ind] = s; flag[ind] = 1; cnt++; return true; } } return false;}bool is_prime(int x) { if (x < 2) return false; for (int i = 2, I = sqrt(x); i <= I; i++) { if (x % i == 0) return false; } return true;}int main() { // 初始化 int x; scanf("%d%d%d",&Msize, &n, &m); while (!is_prime(Msize)) Msize++; // 插入部分 for (int i = 0 ; i < n; i++) { scanf("%d", &x); bool insert_status = insert(x); if (!insert_status) printf("%d cannot be inserted.\n", x); } // 查找部分 int ans = 0; for (int i = 0; i < m; i++) { scanf("%d", &x); int t; for (t = 0; t <= Msize; t++) { ans += 1; int ind = (x + t * t) % Msize; if (a[ind] == x || flag[ind] == 0) break; } } printf("%.1f\n", ans * 1.0 / m); return 0;}
关键词:
哈希表与布隆过滤器
全球观热点:好客山东名不虚传!淄博0.85米志愿者喝着奶帮看行李
爱买不买?三星等国外大厂减产倒逼SSD等存储涨价 国产厂商不怕|焦点资讯
当前资讯!素质堪忧?垃圾站现1000万日元 日本12人前去冒领:最终结果意外
孔雀为躲游客拔毛被滑车碾压:为珍贵白孔雀!景区回应_全球速看
【世界报资讯】五一“赛程近半” 文娱及旅游等消费数据有多强劲?
gcc/g++编译 全球最新
全球百事通!家电行业周报:三大白电4月空冰洗排产数据较好
每日简讯:提前十一天!《塞尔达传说:王国之泪》意外偷跑:模拟器可玩
终于像是“次世代”了:微软为Xbox开发新版UI
高质量发展调研行丨产业集群提速 项目建设正酣-天天快资讯
五一返程注意!暴雨大暴雨要来了:华东、华中将现今年来最强降雨_环球快讯
世界微资讯!特斯拉差点破产:马斯克入选瑞典“失败博物馆”
曝小鹏“自动驾驶”避让大车险冲出高架 客服回应:会反馈核实|世界播资讯
时讯:失业潮或在路上!IBM计划用AI取代7800个岗位
环球观焦点:5月24开播!美版《西游ABC》来了:杨紫琼演观音 吴彦祖演美猴王
天天热头条丨傅欢俱乐部赛事达成200次出场,中超175场,中甲25场
频频把辅助驾驶当成自动驾驶:一嘴硬的理想车主撞了-全球热门
云南母鸡山服务区冲厕出现红水吓跑小孩:工作人员释疑 长见识 全球即时
对标苹果!微软自研Arm芯片在路上了|天天播报
靠增程抢的充电桩 凭什么让给纯电? 当前速讯
环球观察:学系统集成项目管理工程师(中项)系列16a_风险管理(上)
今亮点!AI组建社交鬼城 所有人类禁止入内:上万AI自主聊天!
加快IPv4退网:我国IPv6从能用到好用了_当前速看
靠增程抢的充电桩 凭什么让给纯电?
苹果版“余额宝”开局迅猛!Apple Card四天吸金69亿元_天天报资讯
全球球精选!刘亦菲国籍能改回来吗 刘亦菲国籍
【经验分享】使用Windows自带Xbox显示游戏帧率
美国4月ISM制造业环比上升但连续六个月萎缩,Markit制造业重回扩张
23年4月新能源汽车品牌销量排名来了 埃安、理想杀疯了|焦点资讯
超越《长空之王》!电影《人生路不熟》成劳动节单日票房冠军
【全球新视野】特斯拉又“失控” 车头撞没:这次不是单踏板的祸 别克变道所致网友称可怜
国内票房破4亿!《长空之王》国外口碑解禁:老外狂赞 歼20等精彩
孙殿义_环球新资讯
热资讯!孙楼村
算法3:质数的个数-全球观察
【世界报资讯】扛起农业大市担当 打造新时代鱼米之乡实践样板
视点!小米汽车可期!网友在厦门4S店偶遇卢伟冰
男子路边尝大爷樱桃没买被收2元直呼憋气 主动让尝:网友吐槽坑
全球聚焦:找段错误找了一个小时,纪念一下
环球今热点:2023-05-01:给你一个整数 n , 请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...]
20 文件系统的格式化操作_世界聚看点
天天热点评!详解 HTTPS 概念
当前快播:荷兰一男子疯狂捐精成550个孩子的爸爸:被判禁止捐精 再捐每次罚款76万
环球实时:吉利副总裁:不管极氪蔚来 中国品牌总要有一个打BBA的
当前简讯:男子订民宿被毁约 房东:住满了 没办法
定制长沙独家游玩攻略,大学生手绘旅游地图 世界今日讯
Mac M芯片使用PD安装centos7无页面安装
环球观点:自研“北斗高精”!百度地图宣布攻破“宇宙最难”8D重庆隧道导航
天天动态:米粉直呼Redmi Note 12 Turbo续航太顶:亮屏4小时耗电才33% 用的还是流量
焦点速递!斗图冯骥才看了答案。
天天微速讯:C# 基础编程题集锦
最近公共祖先 倍增算法
《长空之王》无悬念领跑!五一档新片总票房破10亿元:你贡献多少?
赢麻了!DC:黑人版《超人》有望成为现实
金帝纯黑68%巧克力薄片2盒19.9元:浓醇美味
全球今亮点!山东齐鲁工业大学官网招生计划 山东齐鲁工业大学官网
【天天快播报】新系统基于鸿蒙!华为海外发布4G新机Nova 11i:搭载骁龙680、2200元
时讯:高速上2车追尾洒落大量现金 场面壮观:网友直呼想停车去捡 目击者称是冥币
气温骤降超10℃!新一轮冷空气来袭:局地暴雨大雪 环球快看
全球球精选!Win11虚拟桌面切换动画终于回归!可惜依然生硬
天天视讯!“五一”去怒江,穿越东方大峡谷
最低分辨率仅648P!《星战绝地:幸存者》PS5版优化同样翻车_环球微动态
关注:大学选课是啥_大学选课是什么意思
国内普工月薪1万块 父母看病报销!马斯克称特斯拉每个人都是工人 经济严重衰退将来临|全球球精选
今年五一国人太疯狂!珠穆朗玛峰凌晨两点还在堵 手冻肿还有人插队 观天下
新消息丨lua基础语法篇一
5年级上册语文书课文_5年级上册语文书
【天天新视野】《饥饿游戏》美女演员晒照反击黑客勒索:我想展示给谁看都行
《英雄联盟》人机“智商”将升级:会打野抢龙了-每日时讯
苹果的糖煮制脯技术 下_关于苹果的糖煮制脯技术 下的简介
人类希望!星舰并未失败 今年砸20亿美元重发射 马斯克详解爆炸细节厉害了
LC 3. 无重复字符的最长子串 全球实时
世界实时:SRIO接口卡航电总线解决方案
Java线程池中的四种拒绝策略
全球播报:我在画画的拼音_画画的拼音
这波太狠了!CMA禁止微软在未来10年内收购动暴 热点聚焦
世界看热讯:中文互联网青春流落“天涯”
资讯推荐:山东一景区霸气公告:看不到景观退款
天玑之王诞生!iQOO Neo8 Pro前瞻:性能霸榜安卓阵营
快看:真鞋底“烤机”!男子鞋里藏48块CPU入境被海关查获
速看:恐难回本:《圣斗士》电影日本上映3天票房仅250万
关于Linux系统-sshd服务-AllowUsers与AllowGroups-选项的安全加固配置
工厂方法与FactoryBean
9472米!我国开钻亚洲最深油气井
今日讯!apex英雄手游版什么时候上线 apex英雄手游上线时间一览
70%的人都没做到!夏季开空调前的这些事项必须做到位_环球新要闻
韩国芯片继续暴跌:三星等存储没人买!国产SSD无惧竞争 2TB杀到489元
全球微速讯:终于改了!微软决定减少Win11通知数量
海南一漂流景区五一堵船了 网友:好像在下饺子一样
短讯!孙晓玲
多亏了国产SSD!硬盘进入“白菜价”时代
当前资讯!3人合吃一份自助餐:服务员劝阻被怼
苹果华为小米OPPO和vivo手机壳只要5.9元起:覆盖上百款机型 总有一款适合你
回力2023春季新款老爹运动鞋到手29.9元起:舒适透气_全球看点
马里奥成就游戏改编作品之最_天天热资讯
“五一”假期第二天全国道路交通总体平稳有序-全球最新
马里奥成就游戏改编作品之最
环球快消息!疯狂!淄博烧烤店主为劝退游客自己刷差评 犄角旮旯里的烧烤店都能被发现
锐龙7000系烧毁问题解决:AMD推送AGESA 1.0.0.7 BIOS主板固件更新