当前位置: 首页 > news >正文

哈希表---闭散列

闭散列

当我们用哈希函数的时候,其中一个就是除留余数法

取这个表的长度len,按照哈希函数:Hash(key) = key% len,将这个位置映射到表中

通过上面的除留余数法,会有哈希碰撞的问题,可以通过闭散列来解决

闭散列也叫开放定址法,通过线性探测,依次找后面的位置存储

插入 

 哈希表数据定义

enum State
{EMPTY,EXIST,DELETE
};template<class K, class V>
struct HashData
{pair<K, V> _kv;State _state=EMPTY;
};

 哈希表的底层可以用vector封装 

template<class K,class V>
class HashTable
{
public:bool insert(const pair<K,V>& kv){...........}private:vector<HashData<K, V>> _ht;size_t _n = 0;//记录表中数据个数
};

插入问题1

当用除留余数法的时,除以的的vector的capacity还是size呢?

bool insert(const pair<K,V>& kv){    int hashi = kv.first% _ht.size();int index = hashi;int i = 1;while (_ht[index]._state ==EXIST){index = hashi + i;index %= _ht.size();i++;}_ht[index]._kv = kv;_ht[index]._state = EXIST;_n++;}

答案是size,因为用vector的[ ]的时候,是只能访问size的部分的,假如是capacity,算出来的值可以就大于size了,就无法访问了

插入问题2 

是不是有疑惑,当size==0的时候怎么处理?那就要扩容了

还有什么情况下要扩容?

在载荷因子较大的情况下要进行扩容

插入问题3

怎么扩容?

你们的脑瓜子一想简单啦,直接用vector的reserve就好啦,不对的,vector的reserve是扩大了capacity,size没有变的

我们可以用resize进行扩容,risize既扩容又初始化,size改变了

再把旧表数据移到新表

bool insert(const pair<K,V>& kv){if (Find(kv.first))return false;if (_ht.size()==0||_n * 10 / _ht.size() >= 7){int newsize = _ht.size() == 0 ? 10 : _ht.size() * 2;HashTable<K, V> newht;//对原来insert进行复用newht._ht.resize(newsize);//遍历旧表,来初始化新表for (auto& data : _ht){if (data._state == EXIST){newht.insert(data._kv);}}_ht.swap(newht._ht);}//线性探测int hashi = kv.first% _ht.size();int index = hashi;int i = 1;while (_ht[index]._state ==EXIST){index = hashi + i;index %= _ht.size();i++;}_ht[index]._kv = kv;_ht[index]._state = EXIST;_n++;return true;}

相关文章:

  • colmap在windows上编译好的程序直接可以运行支持cuda
  • Spring是怎么处理循环依赖的
  • 【车载以太网测试从入门到精通】——SOME/IP协议测试
  • 聊聊Python中的lambda函数的使用以及模块和包是什么?
  • F28034中断
  • 深入理解内联函数(C语言)
  • YOLO系列模型疑问
  • python:__set_name__使用
  • Algoriddim djay Pro Ai for Mac:AI引领,混音新篇章
  • windows 下nginx常用命令
  • 本地图片先压缩,再上传
  • 中国电子学会(CEIT)2023年09月真题C语言软件编程等级考试四级(含详细解析答案)
  • 【Shell】sed编辑器实例
  • 上下文视觉提示实现zero-shot分割检测及多visual-prompt改造
  • SpringBoot中如何在服务器进行校验?
  • python3.6+scrapy+mysql 爬虫实战
  • 《Java编程思想》读书笔记-对象导论
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Apache Pulsar 2.1 重磅发布
  • Apache的基本使用
  • Bootstrap JS插件Alert源码分析
  • CSS 三角实现
  • css的样式优先级
  • ES10 特性的完整指南
  • express.js的介绍及使用
  • java概述
  • java小心机(3)| 浅析finalize()
  • JSDuck 与 AngularJS 融合技巧
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Just for fun——迅速写完快速排序
  • k8s 面向应用开发者的基础命令
  • learning koa2.x
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 诡异!React stopPropagation失灵
  • 面试遇到的一些题
  • 强力优化Rancher k8s中国区的使用体验
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 在weex里面使用chart图表
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #if 1...#endif
  • #ifdef 的技巧用法
  • (1)bark-ml
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (floyd+补集) poj 3275
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (六)Flink 窗口计算
  • (六)vue-router+UI组件库
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档