哈希表的实现(1)----除留余数法实现

一,哈希表的介绍

 哈希表是一种通过哈希思想实现的一种数据结构。哈希表这种数据结构的特点便是可以通过一个值快速的定位这个值所在的位置实现插入,删除,查找。在这篇博客里面,我们便来实现一个通过除留余数法实现的一个哈希表。

二,哈希表的实现

1,哈希表的结构

因为这里要实现的是一个除留余数法实现的一个哈希表,所以是要用到线性探测的方法的。所以在哈希表内部的成员里便要一个连续的存储结构,所以便可以用一个vector<>

vector里面的元素该用什么类型呢?因为要实现一个比较漂亮的哈希表,所以这个哈希表里面的元素最好能够表示当前的状态,所以这里我们得自己定义hashData。还有为了方便的统计哈希表里面的元素个数,我们又得定义一个_n表示哈希表里面的元素个数。

结构定义如下:

	enum State{EMPTY,//代表空状态EXIST,//代表存在状态DELETE//代表删除状态};template<class K,class V>struct hashData{State _st;//状态pair<K, V>_kv;//元素数据};template<class K,class V>class HashTable{private:vector<hashData<K, V>> _hashtables;size_t _n = 0;//表示元素个数,并且要初始化,并且一定得是size_t类型的变量(预防插入一个关键值为负数的元素)};

二,插入操作实现

插入操作的实现的实现主要分为以下几步:

1,计算插入值对应的位置。

2,如果这个位置上面已经有元素了便要往后线性探测。(这里便是出现了哈希冲突)

3,如果插入的元素已经把表给填满了便要开新表,然后将旧表中的值重新映射填入到新表中。然后再交换给旧表。

插入操作优化的点:

在插入时最讨厌的便是出现哈希冲突,所以为了减少哈希冲突的出现便可以在定义一个叫做负载因子。一般负载因子的值达到了0.7便要开始扩容。

代码实现如下:

bool Insert(const pair<K, V>key){if (_n * 10 / _hashtables.size() == 7){int newsize = 2 * _hashtables.size();HashTable<K,V>newHash;for (int i = 0;i < _hashtables.size();i++){if (_hashtables[i]._st == EXIST){newHash.Insert(_hashtables[i]._kv);}}_hashtables.swap(newHash._hashtables);}int hashi = key.first % _hashtables.size();while (_hashtables[hashi]._st == EXIST){hashi++;hashi %= _hashtables.size();}_hashtables[hashi]._kv = key;_hashtables[hashi]._st = EXIST;_n++;return true;}

三,查找操作

哈希表的查找操作步骤如下:

1,通过除留余数法计算出hashi。

2,通过hashi定位到指定位置,如果这个指定位置的状态是EMPTY便停止。反之便继续找。

3,找到了便将该位置返回。

4,找不到便返回一个nullptr。

实现代码如下:

hashData<K, V>* Find(const pair<K, V>key){size_t hashi = key .first% _hashtables.size();while (_hashtables[hashi]._st != EMPTY){if (_hashtables[hashi]._st == EXIST&&_hashtables[hashi]._kv == key){return &_hashtables[hashi];}hashi++;hashi %= _hashtables.size();}return nullptr;}

在实现了查找操作以后便可以在插入操作里面实现一个不能插入相同元素的功能。代码如下:

if (Find(key))
{return false;
}

四,删除操作

这里的删除操作实现的是一种伪删除法。删除时通过Find()找到对应的值,然后将这个值对应的状态改为DELETE即可。

代码:

bool Erase(const pair<K, V>key)
{hashData<K, V>* ret = Find(key);if (ret){ret->_st = DELETE;return true;}return false;
}

五,全部代码

#include<iostream>
#include<vector>
using namespace std;namespace Hash
{enum State{EMPTY,//代表空状态EXIST,//代表存在状态DELETE//代表删除状态};template<class K,class V>struct hashData{State _st;//状态pair<K, V>_kv;//元素数据};template<class K,class V>class HashTable{public:HashTable(){_hashtables.resize(10);}bool Insert(const pair<K, V>key){if (Find(key)){return false;}if (_n * 10 / _hashtables.size() == 7){int newsize = 2 * _hashtables.size();HashTable<K,V>newHash;for (int i = 0;i < _hashtables.size();i++){if (_hashtables[i]._st == EXIST){newHash.Insert(_hashtables[i]._kv);}}_hashtables.swap(newHash._hashtables);}int hashi = key.first % _hashtables.size();while (_hashtables[hashi]._st == EXIST){hashi++;hashi %= _hashtables.size();}_hashtables[hashi]._kv = key;_hashtables[hashi]._st = EXIST;_n++;return true;}hashData<K, V>* Find(const pair<K, V>key){size_t hashi = key .first% _hashtables.size();while (_hashtables[hashi]._st != EMPTY){if (_hashtables[hashi]._st == EXIST&&_hashtables[hashi]._kv == key){return &_hashtables[hashi];}hashi++;hashi %= _hashtables.size();}return nullptr;}bool Erase(const pair<K, V>key){hashData<K, V>* ret = Find(key);if (ret){ret->_st = DELETE;return true;}return false;}void Print(){for (int i = 0;i < _hashtables.size();i++){if (_hashtables[i]._st == EXIST){printf("->%d\n",_hashtables[i]._kv.second);}else if (_hashtables[i]._st == DELETE){printf("%d->D\n", _hashtables[i]._kv.second);}else{printf("-> \n");}}}private:vector<hashData<K, V>> _hashtables;size_t _n = 0;//表示元素个数,并且要初始化};void HT1(){HashTable<int, int>hash;hash.Insert(make_pair<int, int>(1, 1));hash.Insert(make_pair<int, int>(1, 8));hash.Insert(make_pair<int, int>(1, 9));hash.Insert(make_pair<int, int>(1, 12));hash.Insert(make_pair<int, int>(1, 12));hash.Insert(make_pair<int, int>(1, 19));hash.Insert(make_pair<int, int>(1, 10));hash.Insert(make_pair<int, int>(1, 20));hash.Erase(make_pair<int, int>(1, 10));hash.Insert(make_pair<int, int>(1, 30));hash.Print();}}

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

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

相关文章

IntersectionObserver

IntersectionObserver 这个API主要实现图片懒加载、加载更多等等。 该API作用是观察两个元素之间有没有交叉&#xff0c;有没有重叠 现在要做的是当图片跟视口有交叉的情况下&#xff0c;把data-src的图片路径替换给src属性 //第一个参数是 回调&#xff0c;第二个参数的 配置…

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染 if/else&#xff1a;条件渲染 ArkTS 提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用 if、else 和 else if 渲染对应状态下的 UI 内容。 写法和 TS 的一样&#xff0c;简单看一下即可…

【数据结构之树和二叉树】

数据结构学习笔记---007 数据结构之树和二叉树概念篇1、树的概念和结构1.1、树的相关概念1.2、树的存储结构 2、二叉树概念及结构2.1、二叉树概念2.2、满二叉树2.3、完全二叉树2.4、满二叉树或完全二叉树的存储形式 3、堆的概念及结构3.1、堆的性质3.2、堆的意义 4、二叉树的存…

python_selenium_安装基础学习

目录 1.为什么使用selenium 2.安装selenium 2.1Chrome浏览器 2.2驱动 2.3下载selenium 2.4测试连接 3.selenium元素定位 3.1根据id来找到对象 3.2根据标签属性的属性值来获取对象 3.3根据xpath语句来获取对象 3.4根据标签的名字获取对象 3.5使用bs4的语法来获取对象…

解惑:测试圈网红工具 Jmeter 到底难在哪里

作为一名测试人员&#xff0c;你是否也曾经遇到过这些问题&#xff1a; 同样的起点&#xff0c;同样的工作时间&#xff0c;为什么别人接那么多项目&#xff0c;你还是在点点点&#xff1b;为什么别人升职了&#xff0c;而你还在原地踏步&#xff1f; 同样的工作内容&#xf…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表&#xff0c;表中创建一个tinyint类型的数据。当我们不指定tiny…

【贪心】重构字符串

/*** 思路&#xff1a;如果s长度小于2&#xff0c;直接返回s&#xff0c;假设字符串s的长度为n。* n为偶数&#xff0c;如果字符串中的某个字符数量超过 n/2 则肯定会存在相邻的字符。* n为奇数&#xff0c;如果字符串中的某个字符的数量超过 &#xff08;n1&am…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了&#xff01;距离截稿还有24天&#xff0c;想冲ICML的同学速度&#xff01; ICML 全称 International Conference on Machine Learning&#xff0c;由国际机器学习学会&#xff08;IMLS&#xff09;举办&#xff0c;与NIPS一同被认为是人工智能、机器学…

debian 11 arm64 aarch64 D2000 平台编译 box86 box64 笔记

参考资料 https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md 源码地址 GitHub - ptitSeb/box86: Box86 - Linux Userspace x86 Emulator with a twist, targeted at ARM Linux devices deb在线源地址&#xff08;打不开&#xff09;&#xff1a; Itais box86…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

一文解析低代码平台

一、低代码概念 低代码开发平台是一种无需编码或者只需要少量代码即可快速生成应用程序的开发平台&#xff0c;通过可视化进行应用程序开发的方法&#xff0c;让不同经验水平的开发人员可以通过图形化的用户界面&#xff0c;使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程…

MySQL夯实之路-存储引擎深入浅出

innoDB Mysql4.1以后的版本将表的数据和索引放在单独的文件中 采用mvcc来支持高并发&#xff0c;实现了四个标准的隔离级别&#xff0c;默认为可重复读&#xff0c;并且通过间隙锁&#xff08;next-key locking&#xff09;策略防止幻读&#xff08;查询的行中的间隙也会锁定…

Redis:原理速成+项目实战——Redis实战13(GEO实现附近商铺、滚动分页查询)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战12&#xff08;好友关注、Feed流&#xff08;关注推送&#xff09;、滚动分页查…

基于ssm的校园预点餐系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的校园预点餐系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

大语言模型向量数据库

大语言模型&向量数据库 LARGE LANGUAGE MODELSA. Vector Database & LLM WorkflowB. Vector Database for LLMC. Potential Applications for Vector Database on LLMD. Potential Applications for LLM on Vector DatabaseE. Retrieval-Based LLMF. Synergized Exampl…

element+vue 之图片放大器

1.安装插件 npm install vue-photo-zoom-pro2.main.js导入 // 放大镜 import VuePhotoZoomPro from vue-photo-zoom-pro Vue.use(VuePhotoZoomPro)3.页面使用 <vue-photo-zoom-pro:url"imgUrl":out-zoomer"true":scale"2"style"width:…

Leetcode202快乐数(java实现)

今天分享的题目是快乐数&#xff1a; 快乐数的定义如下&#xff1a; 快乐数&#xff08;Happy Number&#xff09;是指一个正整数&#xff0c;将其替换为各个位上数字的平方和&#xff0c;重复这个过程直到最后得到的结果为1&#xff0c;或者无限循环但不包含1。如果最终结果为…

使用ElementUI的el-tab+vxe-table表格+复选框选择

效果&#xff1a; 功能&#xff1a;首先进来是全部清空的状态的 点击左边选择不同项右边会实时发送接口获取数据填充表格 复选的内容可以保留显示&#xff0c;比如A的1勾选后切换到B再切换回来A的1仍然是勾选状态 说实话官网的setCheckboxRow方法我实现不了&#xff0c;这里…

2024年华夏银行总行社会招聘公告

信息科技部自动化测试与开发类岗  工作地点&#xff1a;北京市 学历要求&#xff1a;本科及以上 工作职责 1、持续推进自动化测试的开展&#xff0c;提升自动化测试覆盖率,包括方案设计、测试分析、测试执行和总结等。 2、负责自动化测试工具和框架搭建&#xff0c;根据…

CSAPP阅读笔记-信息的表示和处理

信息的表示和处理 包括整数、浮点数的存储格式、计算中可能存在的问题等 信息存储 大多数计算机使用8位的块&#xff0c;或者字节(byte)&#xff0c;作为最小的可寻址的内存单位&#xff0c;而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组&#xff0c…