算法与数据结构--散列表与哈希算法

引入

我们知道c++的set和unorder_set(map本质上也是set,就是把set的存储对象换成键值对结构体),set底层是红黑树实现的,那么unorder_set是怎么实现的呢?这一节就来讲讲实现unorder_set的哈希表,也叫做散列表。

一.ADT集合与符号表

1.ADT集合

2.ADT符号表

二.散列技术(哈希算法)实现符号表

1.散列技术介绍

符号表可以怎么实现呢?

首先我们想到的是结构体数组?但是数组的查找速度,当遍历查找的时候是O(n),当二分查找的时候是O(nlogn)。速度并不高。
有没有办法像我们人类的记忆功能一样,给他键,它就立马能给出对应的值。也就是让查找的速度变为O(1)。

这时候我们就需要来了解散列技术。无论你给它什么数据,它都能还你一个数字。平均情况下时间复杂度是常数,最坏情况才达到O(n)。

2.散列技术的实现

散列有两种形式,一种是开散列(外部散列),它将符号表元素存放在一个潜无穷的空间里,能处理任意大小的集合。
另一种是闭散列(内部散列),它使用一个固定大小的存储空间,所能处理的 集合大小不能超过其存储空间大小。

1.开散列

如何存储数据呢?

如何查找数据呢?
给你你个数字,先将用其对应的哈希算法算出其对应的K值,然后在K值中遍历链表查找。
比如8,H(8)=8,然后在8中遍历查找,时间复杂度就是为常数。

可以看出开散列表是将数组和链表结合在一起的数据结构,并且利用二者的优点,克服二者的缺点。

2.闭散列

闭散列表将表中元素直接存放在桶单元中。
闭散列表中的每个桶都只能存放集合中的一个元素。

每个单元只存放一个元素,那么闭散列需要如何解决冲突问题呢

当要把元素x存放到桶h(x)中,但发现这个桶已被其它元素占用时,就发生了冲突。为了解决闭散列中的冲突,需要使用重新散列技术,使得发生冲突时,按重新散列技术可以选取其他桶序列h1(x),h2(x)..,逐个试探。

【1】线性重新散列技术--一个一个往后找

简单说就是一个一个往后找,比如上面的图9被占用了,就看见10有没有被占用,没有就存在10中,假设10也被占用了,就存在11中,如果11也被占用了,那就存在0中,以此类推。。。

【2】平方探测法

【3】查找长度计算

平均成功查找长度--存储过的位置索引之和除以元素总个数。


 

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

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

相关文章

[每周一更]-(第78期):Nginx负载均衡proxy_pass代理模块常用参数配置

0、负载均衡的策略 使用场景示例 # 定义要包含在负载均衡方案中的服务器。 # 最好使用服务器的私有IP以获得更好的性能和安全性。 http {upstream backend {server 10.1.0.101;server 10.1.0.102;server 10.1.0.103;}server{server_name game1.test.com;listen 80;location / {…

java流浪动物保护系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 流浪动物保护系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

Ubuntu 常用命令之 echo 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 echo 是一个在 Ubuntu 系统下常用的命令,主要用于在终端输出字符串或者变量。 echo 的基本语法 echo [option] [string]echo 命令的参数包括 -n:不输出结尾的换行符。-e:启用反斜杠转义字符。…

【mongoose】 Model.create() no longer accepts a callback 报错解决

在最新版的 mongoose 操作 MongoDB 数据库的时候,当我们插入一条数据时候,会报错 :Model.create() no longer accepts a callback,看了很多文章都说是,版本太高,都妥协选择了降低回旧版本,但我就…

服务器数据恢复-误操作导致xfs分区数据丢失的数据恢复案例

服务器数据恢复环境: 某品牌OceanStorT系列某型号存储MD1200磁盘柜,组建的raid5磁盘阵列。上层分配了1个lun,安装的linux操作系统,划分两个分区,分区一通过lvm进行扩容,分区二格式化为xfs文件系统。 服务器…

YZ系列工具之YZ03:高版本Excel的自定义菜单

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

搜索二叉树(超详解)

文章目录 前言查找搜索二叉树的结构insertfinderase递归版本Findinserterase 二叉树的拷贝问题搜索二叉树的应用Key模型Key/Value的模型 前言 普通二叉树其实意义不大, 如果用二叉树存储数据的话,还不如顺序表,链表这些。 搜索二叉树它的意义…

如何改善与 Next Paint (INP) 的交互

但谷歌也会关注访问者到达后你的网站体验有多好。 在过去的几年里,谷歌已经彻底改变了哪些页面体验信号被收集并用作排名因素。 在引入核心网络指标后,谷歌逐渐调整了它们的衡量方式,以便更好地反映真实的用户体验。 然而,随着…

12 Vue3中使用v-if指令实现条件渲染

概述 v-if指令主要用来实现条件渲染,在实际项目中使用得也非常多。 v-if通常会配合v-else-if、v-else指令一起使用,可以达到多个条件执行一个,两个条件执行一个,满足一个条件执行等多种场景。 下面,我们分别演示这三…

js显示实时时间

文章目录 一、效果二、思路三、最后 一、效果 用JS实现XXXX年XX月XX日 星期X XX时XX分XX秒 效果 效果 &#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>time</title><script t…

QTNet:Query-based Temporal Fusion with Explicit Motion for 3D Object Detection

参考代码&#xff1a;QTNet 动机和出发点 自动驾驶中时序信息对感知性能具有较大影响&#xff0c;如在感知稳定性维度上。对于常见的时序融合多是在feature的维度上做&#xff0c;这个维度的融合主要分为如下两个方案&#xff1a; 1&#xff09;BEV-based方案&#xff1a;将之…

nodejs+vue+ElementUi会员制停车场车位系统

总之&#xff0c;智能停车系统使停车场管理工作规范化&#xff0c;系统化&#xff0c;程序化&#xff0c;避免停车场管理的随意性&#xff0c;提高信息处理的速度和准确性&#xff0c;能够及时、准确、有效的查询和修改停车场情况。 三、任务&#xff1a;小组任务和个人任务 智…