【C++】哈希一

这篇博客要说的是哈希算法哈希又称为散列,它是将存储的和存储的位置建立起关联关系的一种算法,或者说是一种任意长度的数据映射为固定长度的输出的算法

什么意思呢?我们来看一个例子:比如说我们要存储1,2,3,4,5,6这几个数据,我们可以开6个空间大小的数组用于存储,正好下标(位置)跟数据(值)之间是有一定的关系的,很容易存储。

但是假如是下面6个数据呢?1,2,3,1000,1001,1002难道我们还要开1000个空间不成?当然不可以,这太浪费了,于是就开始想办法,让它们都对于总个数6取余不就得到范围比较小的值了吗。它们取余后分别得到1,2,3,4,5,0,我们让这几个数据当作它们各自的位置,这样每一个数据都和一个位置相互对应了,这就是一种解决问题的方法。

上面两个例子已经很形象的说明了什么是哈希,并且第一个例子就是我们的直接定址法,第二个例子就是除留余数法

但是我们的除留余数法还是有问题的,有没有可能两个数取余后得到的数相同?肯定是有可能的,这种情况就叫哈希冲突。我们可以知道,哈希冲突越多,那么效率就越低。所以我们一般当负载因子或者叫载荷因子就是实际存的数据个数除以表的大小)大于某个数就要扩容,增大表的大小。这样就可以一定程度的保证效率。那么接下来我们就要解决哈希冲突,有两种方法,一种叫闭散列开放定址法,一种叫开散列拉链法,也叫哈希桶

它们分别是什么意思呢?下面我们分别来说,闭散列开放定址法就是在这个固定长度的数组中如果一个值要放的位置已经有其他的值了,那么就从这个位置向后边找,直到找到空的位置放入,如果找到结尾,那么再返回头去找。这个向后边找可以一个一个找,就叫线性探测,也可以1,4,9,16.....这样二次方数这样找,就叫做二次探测

下面一个是哈希桶也叫开散列拉链法,就是我们在哈希表中存某个数据所在节点的指针,如果下个数据仍然在这个位置,那么就挂在上个数据的下边就可以了,挂上数据之后就像一个桶或者像拉链,于是名字由此得名

那么接下来我们就分别用这两种解决哈希冲突的方法来实现一下哈希表,这里我们的哈希表中的值先按整形看,等后边我们再慢慢加上模板等一系列东西,先看第一种方法

enum state {EMPTY,EXIST,DELETE
};
struct HashNode {int val=0;state state=EMPTY;
};
class HashTable {
public:HashTable(size_t n = 10) {_hashvec.resize(n);}HashNode* find(size_t key) {int hashi = key % _hashvec.size();while (_hashvec[hashi].state != EMPTY && _hashvec[hashi].val != key) {hashi++;hashi %= _hashvec.size();}if (_hashvec[hashi].state == EMPTY)return nullptr;return &_hashvec[hashi];}bool insert(size_t data) {if (find(data))return false;if (_n * 10 / _hashvec.size() >= 7) {//扩容HashTable newtable;newtable._hashvec.resize(_hashvec.size()*2);for (size_t i = 0; i < _hashvec.size(); i++) {if(_hashvec[i].state==EXIST)newtable.insert(_hashvec[i].val);}_hashvec.swap(newtable._hashvec);}size_t hashi = data % _hashvec.size();while (_hashvec[hashi].state == EXIST) {hashi++;hashi %= _hashvec.size();}_hashvec[hashi].val = data;_hashvec[hashi].state = EXIST;_n++;return true;}bool erase(size_t data) {HashNode* tmp = find(data);if (tmp == nullptr)return false;tmp->state = DELETE;--_n;return true;}
private:size_t _n=0;vector<HashNode> _hashvec;
};

再看第二种方法

struct HashNode {HashNode(size_t n=0):val(n),_next(nullptr){}size_t val = 0;HashNode* _next = nullptr;};class HashTable {public:HashTable(size_t n=10) {_hashvec.resize(n, nullptr);}HashNode* find(size_t key) {size_t hashi = key % _hashvec.size();HashNode* cur = _hashvec[hashi];while (cur) {if (cur->val == key)return cur;cur = cur->_next;}return nullptr;}bool insert(size_t key) {if (find(key))return false;if (_n == _hashvec.size()) {//扩容HashTable newtable(_hashvec.size() * 2);for (size_t i = 0; i < _hashvec.size(); i++) {HashNode* cur = _hashvec[i];HashNode* next = nullptr;while (cur) {next = cur->_next;size_t hashi = cur->val % newtable._hashvec.size();cur->_next = newtable._hashvec[hashi];newtable._hashvec[hashi] = cur;/*if (newtable._hashvec[hashi] == nullptr) {newtable._hashvec[hashi] = cur;}else {HashNode* tmp = newtable._hashvec[hashi];while (tmp->_next) {tmp = tmp->_next;}tmp->_next = cur;}cur->_next = nullptr;*/cur = next;}_hashvec[i] = nullptr;}_hashvec.swap(newtable._hashvec);}size_t hashi = key % _hashvec.size();HashNode* newnode = new HashNode(key);newnode->_next = _hashvec[hashi];_hashvec[hashi] = newnode;++_n;return true;}bool erase(size_t key) {size_t hashi = key % _hashvec.size();HashNode* prev = nullptr;HashNode* cur = _hashvec[hashi];while (cur&&cur->val != key) {prev = cur;cur = cur->_next;}if (cur == nullptr)return false;if (prev == nullptr) {_hashvec[hashi] = cur->_next;}else {prev->_next = cur->_next;}delete cur;return true;}private:size_t _n = 0;vector<HashNode*> _hashvec;};
}

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

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

相关文章

【SLAM】在Win10上实现Nerf-Pytorch【GPU版】

文章目录 ReadMe安装依赖运行下载两个示例数据集:lego和fern训练一个低分辨率的Lego NeRF:训练一个低分辨率蕨类植物NeRF:更多数据集预训练模型可复现实现1、下载nerf-pytorch工程2、安装依赖3、下载数据4、运行lego NeRF:ReadMe Github链接 NeRF (神经辐射场)是一种在合成…

基于变压器的手持式超声图像中乳腺病变的分类不一致性测量表征

超声成像作为一种替代的低成本、易于获取的非电离成像方式已显示出巨大的前景&#xff0c;可用于乳腺癌筛查。特别是&#xff0c;随着最近便携式设备的出现&#xff0c;超声检查预计将在中低收入国家中越来越普及。然而&#xff0c;超声成像在乳腺癌诊断中的可靠性高度依赖于操…

竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖&#xff0c;适合作为竞…

【数据结构|C语言版】双向链表

前言1. 初步认识双向链表1.1 定义1.2 结构1.3 储存 2. 双向链表的方法&#xff08;接口函数&#xff09;2.1 动态申请空间2.2 创建哨兵位2.3 查找指定数据2.4 指定位置插入2.5 指定位置删除2.6 头部插入2.7 头部删除2.8 尾部插入2.9 尾部删除2.10 计算链表大小2.11 销毁链表 3.…

记录一下hive跑spark的insert,update语句报类找不到的问题

我hive能正常启动&#xff0c;建表没问题&#xff0c;我建了一个student表&#xff0c;没问题&#xff0c;但执行了下面一条insert语句后报如下错误&#xff1a; hive (default)> insert into table student values(1,abc); Query ID atguigu_20240417184003_f9d459d7-199…

【Image captioning】论文阅读九—Self-Distillation for Few-Shot Image Captioning_2022

摘要 大规模图像字幕数据集的开发成本高昂,而大量未配对的图像和文本语料库可能有助于减少手动注释的工作。在本文中,我们研究了只需要少量带注释的图像标题对的少样本图像标题问题。我们提出了一种基于集成的自蒸馏方法,允许使用不成对的图像和字幕来训练图像字幕模型。该…

VBA脚本: excel隐藏和展开指定行 【图文】

打开开发工具功能 【文件】-》【选项】-》【自定义功能区】-》勾选【开发工具】-》【确定】 代开VBA编辑器 【开发工具】-》【Visual Basic】 插入模块 编写代码 所有sheet 关闭 Sub HideRowsInAllSheets()Dim ws As WorksheetDim i As Integer 循环遍历所有工作表For E…

【学习笔记】Python大数据处理与分析——Matplotlib数据可视化

一、绘图步骤 1、导入第三方库 import matplotlib.pyplot as plt import numpy as np 2、准备数据 x1 np.linspace(1, 10, 5) y1 np.sin(x1) 3、开始绘图 plt.plot(x1, y1, linewidth3) 4、完善图表 plt.title("plot figure") plt.xlabel("value of x&qu…

OpenHarmony、HarmonyOS和Harmony NEXT 《我们不一样》

1. OpenHarmony 定义与地位&#xff1a;OpenHarmony是鸿蒙系统的底层内核系统&#xff0c;集成了Linux内核和LiteOS&#xff0c;为各种设备提供统一的操作系统解决方案。 开源与商用&#xff1a;OpenHarmony是一个开源项目&#xff0c;允许开发者自由访问和使用其源代码&#…

【Leetcode每日一题】 递归 - 二叉树的所有路径(难度⭐)(59)

1. 题目解析 题目链接&#xff1a;257. 二叉树的所有路径 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 针对二叉树路径的求解问题&#xff0c;我们可以采用深度优先遍历&#xff08;DFS&#xff09;的策略来寻找所…

Java项目如何使用EasyExcel插件对Excel数据进行导入导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架&#xff0c;它以使用简单、节省内存著称。在解析Excel时&#xff0c;EasyExcel没有将文件数据一次性全部加载到内存中&…

linux学习:进程(新建+运行某文件+退出处理函数+等待)

目录 api 创建新进程 注意 运行某文件 例子 注意 例子&#xff0c;等待进程 进程是由进程控制块、程序段、数据段三部分组成 进程有都有一个父进程&#xff0c;除了init&#xff0c;父进程可以创建子进程 每个进程都有一个PID&#xff0c;可以用ps来查看&#xff0c;等…

【行为型模式】策略模式

一、策略模式概述 策略模式(又叫政策Policy模式)&#xff0c;属于对象行为模式下的&#xff1a;Strategy类提供了可插入式(Pluggable)算法的实现方案。 策略模式的定义-意图&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并让它们互相替换。策略模式…

Mybatis常用注解说明

MyBatisPlus 常用注解说明 TableName(opens new window) 描述&#xff1a;表名注解&#xff0c;标识实体类对应的表 使用位置&#xff1a;实体类 TableName("sys_user") public class User {private Long id;private String name;private Integer age;private Strin…

实用图像视频修复工具:完善细节、提高分辨率 | 开源日报 No.225

xinntao/Real-ESRGAN Stars: 25.6k License: BSD-3-Clause Real-ESRGAN 是一个旨在开发实用的图像/视频恢复算法的项目。 该项目主要功能、关键特性和核心优势包括&#xff1a; 提供动漫视频小模型和动漫插图模型支持在线 Colab 演示和便携式 Windows/Linux/MacOS 可执行文件…

如何利用纯前端技术,实现一个网页版视频编辑器?

纯网页版视频编辑器 一、前言二、功能实现三、所需技术四、部分功能实现4.1 素材预设4.2 多轨道剪辑 一、前言 介绍&#xff1a;本篇文章打算利用纯前端的技术&#xff0c;来实现一个网页版的视频编辑器。为什么突然想做一个这么项目来呢&#xff0c;主要是最近一直在利用手机…

OpenCV基本图像处理操作(四)——傅立叶变换

傅里叶变换的作用 高频&#xff1a;变化剧烈的灰度分量&#xff0c;例如边界 低频&#xff1a;变化缓慢的灰度分量&#xff0c;例如一片大海 滤波 低通滤波器&#xff1a;只保留低频&#xff0c;会使得图像模糊 高通滤波器&#xff1a;只保留高频&#xff0c;会使得图像细节…

Golang | Leetcode Golang题解之第31题下一个排列

题目&#xff1a; 题解&#xff1a; func nextPermutation(nums []int) {n : len(nums)i : n - 2for i > 0 && nums[i] > nums[i1] {i--}if i > 0 {j : n - 1for j > 0 && nums[i] > nums[j] {j--}nums[i], nums[j] nums[j], nums[i]}reverse…

Day 14 网络协议

常见网络设备&#xff1a;交换机 路由器 中继器 多协议网关&#xff08;路由器的前身&#xff09; 交换机&#xff1a;用于连接统一网络的设备&#xff0c;实现内网设备通信。 从广义上分为&#xff1a;局域网交换机&#xff0c;广域网交换机 从网络构成分为&#xff1a;接…

Jenkins配置windows/linux从节点

背景&#xff1a; 环境&#xff1a;jenkins环境&#xff08;Ubuntu&#xff09; 节点机器&#xff1a;Linux、Windows 前置条件&#xff1a; 节点机器&#xff1a;安装java、allure、python 1 Linux节点管理机器添加 1.1 系统管理->节点列表->New Node 1.2 节点配置…