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

哈希——哈希表

回顾/本期梗概

        上期我们学习了哈希——字符串哈希(空降链接),本期我们将学习哈希中的哈希表。


1、哈希表原理

        (1)使用数组下标直接标记元素

        哈希表(也叫数列表):是一种高效的、通过把关键词码值映射到表中的一个位置来访问记录的数据结构。

        类似字符串,查找的时间复杂度是常熟时间,缺点是需要消耗更多的内存。

        现在要存储和使用下面的线性表:A(12,83,284,49,183,13491,58).

        为了用O(1)的时间实现查找,可以开一个一维数组A[1...13491],使得A[key]=key,虽显然造成了空间上的很大浪费,尤其是数据范围很大时。

        (2)除余法构造哈希值

        为了使空间开销减少,我们可以对第二种方法加以优化,实际一个哈希函数H(key)=key mod 17,然后令A[H(key)]=key,这样一来定义一个一维数组A[0...16]就已足够,这种方法就是哈希表。

        但这样会造成哈希冲突,比如H(2)H(9)的值都是2.

        这里与字符串 Hash 有所不同,可能不论我们怎样选用哈希函数,还是很难避免产生冲突。

        因此我们考虑对每一个哈希值记一个链表(其实也就相当于邻接表),把所有等于同一个哈希值的数字都存储下来,而查询只要遍历对应的链表即可,这样实际复杂度取决于查询的链表长度,也可以看做是常熟级。

        例如:我们定义哈希函数H(x)=x mod 16,对数组A(12,83,284,49,183,13491,58),进行哈希运算后,插入一些数据的效果如下图。

        (3)哈希函数的构造

        取余法构造哈希:H(key=key mod b,为了尽量避免冲突,一般选取为能够存储下并且尽量大的素数(一般情况下我们根据空间取10^{6}左右的素数)。一般的说,如果 b 的约数越多,那么冲突的几率就越大。


2、使用数组模拟邻接表

        (1)插入关键操作:

v = hash(x);//计算x的哈希值
idx++;
e[idx] = x;
ne[idx] = h[v];
h[v] = idx;

        (2)查找关键操作:

int v = hash(x);//计算x的哈希值
//循环链表
for(int i=h[v];i!=0;i=ne[i]){if(e[i] == x){return true;}
}

例如:读入整数2 5 6 8 3 11,假设h[x]=xmod6

则:每个元素的哈希值是2 5 0 2 3 5

存储数组如下:

element数组:按读入的顺序,存储每个元素的值。

next数组:next[i]存储和element[i]哈希值相同的上一个数的编号。

 header数组:header[i]存储哈希值为i的最后一个元素的编号


!!! 

!!! 

!!! 

 

http://www.lryc.cn/news/445049.html

相关文章:

  • 简单了解 JVM
  • 已经30岁了,想转行从头开始现实吗?什么样的工作算好工作?
  • 快速理解docker(一)docker 简介
  • RHCS认证-Linux(RHel9)-Ansible
  • 【Python】Spyder:科学 Python 开发环境
  • SpringBootWeb响应
  • CMake 构建Qt程序弹出黑色控制台
  • 虚拟机centos_7 配置教程(镜像源、配置centos、静态ip地址、Finalshell远程操控使用)
  • git 删除 git push 失败的记录
  • 【专题】2024年中国白酒行业数字化转型研究报告合集PDF分享(附原数据表)
  • 哪款品牌充电宝性价比比较高?五款性价比绝佳充电宝推荐
  • 巨坑!!华为大数据平台sparksql,连接gauss200数据库
  • BGP相关知识笔记
  • 在 Windows 上运行 Vue 项目时解决 ‘NODE_OPTIONS‘ 错误
  • 面试真题:谈一谈Mysql的分库分表
  • 玄机靶场--蚁剑流量
  • uniapp map设置高度为100%后,会拉伸父容器的高度
  • CICD从无到会
  • 责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例
  • Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch
  • 十一、SOA(SOA的具体设计模式)
  • Mybatis原理
  • 黑马头条day3-2 自媒体文章管理
  • JinDouYun性能测试工具使用方法
  • 操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘
  • 【Oauth2整合gateway网关实现微服务单点登录】
  • WEB领域是不是黄了还是没黄
  • Android系统:系统架构
  • NCNN 源码(1)-模型加载-数据预处理-模型推理
  • 重修设计模式-结构型-享元模式