数据结构基础--散列表

这篇具有很好参考价值的文章主要介绍了数据结构基础--散列表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、散列简介

散列表,又叫哈希表(Hash Table),是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。也就是说,把关键字映射到一个表中的位置来直接访问记录,以加快访问速度。

通常,把这个关键字称为 Key,把对应的记录称为 Value,所以也可以说是通过 Key 访问一个映射表来得到 Value 的地址。而这个映射表,也叫作散列函数或者哈希函数,存放记录的数组叫作散列表

冲突:不同的关键码映射到同一个散列地址

散列表,数据结构,数据结构,散列表

二、散列函数

1)除留余数法

h(key)=key mod M

 key为关键字值,mod代表采用取模运算,M为散列表的长度。

M的取值十分重要,M选取不当可能造成严重冲突。如果key是十进制数,则M应当避免取10的幂。

一般而言,选择一个不超过M的最大的素数P,令散列函数h(key)=key mod P

2)平方取中法

这是一种常用的哈希函数构造方法。这个方法是先取关键字的平方,然后根据可使用空间的大小,选取平方数是中间几位为哈希地址。

哈希函数 H(key)=“key2的中间几位”因为这种方法的原理是通过取平方扩大差别,平方值的中间几位和这个数的每一位都相关,则对不同的关键字得到的哈希函数值不易产生冲突,由此产生的哈希地址也较为均匀。

散列表,数据结构,数据结构,散列表

3)折叠法

折叠法是将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位),这方法称为折叠法。

4)数字分析法

数字分析法是取数据元素关键字中某些取值较均匀的数字位作为哈希地址的方法。即当关键字的位数很多时,可以通过对关键字的各位进行分析,丢掉分布不均匀的位,作为哈希值它只适合于所有关键字值已知的情况。通过分析分布情况把关键字取值区间转化为一个较小的关键字取值区间

散列表,数据结构,数据结构,散列表

三、散列冲突处理办法

1)拉链法

拉链法的基本思想:相同散列地址的记录链成一单链表,m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构

散列表,数据结构,数据结构,散列表

 缺点:极端情况下,所有元素可能都聚集于一个散列地址对应的单链表中,所以最坏情况下完成一个关键字的搜索需要检查全部的n个元素

2)开地址法

散列表,数据结构,数据结构,散列表

线性探测法

散列表,数据结构,数据结构,散列表

需要注意的是, 这里的h(key)就已经进行了一次取模运算

散列表,数据结构,数据结构,散列表

以上图为例,h(key)=key mod 11

①35 mod 11=2 ,2号位置已经被24占用,因此向后探测②(2+1)mod 11=3,3号位置已经被80占用,因此向后探测③(2+2)mod 11=4,4号位置已经被58占用,因此向后探测④(2+3)mod 11=5,5号位置为空,将35放入该位置

缺点:由于是逐个位置向后排列,散列表中的元素产生聚集效应,也就是同义词元素在散列表中密集连续存储,这将导致散列表在镜像元素查找是探查的次数增加,从而影响搜索效率

二次探测法

散列表,数据结构,数据结构,散列表

需要注意的是, 这里的h(key)就已经进行了一次取模运算

 散列表,数据结构,数据结构,散列表

 以上图为例,h(key)=key mod 11

①35 mod 11=2 ,2号位置已经被24占用,需要探测②(2+1^2)mod 11=3,3号位置已经被80占用,重新探测③(2-1^2)mod 11=1,1号位置为空,将35放入该位置

双散列法

散列表,数据结构,数据结构,散列表

 双散列法使用的两个散列函数分别是h1和h2。第一个散列函数用于计算探查序列的起始值,第二个散列函数用于辅助计算候选地址。

h2的作用:对h1散列值产生一个固定增量,实现跳跃式探查;改善二次聚集,对两个散列函数都为同义词的关键字很少

四、性能分析

使用平均查找长度ASL来衡量查找算法,ASL取决于:散列函数,处理冲突办法,装填因子

散列表中已存储集合元素个数n与散列表长M的比例n/M,称为散列表的装填因子。装填因子越大,说明表中记录数越多,表越满,发生冲突的可能性就越大,查找时比较次数就越多

散列表,数据结构,数据结构,散列表

拉链法优于开地址法;除留余数法作散列函数优于其他类型函数文章来源地址https://www.toymoban.com/news/detail-757444.html

到了这里,关于数据结构基础--散列表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构—散列表的查找

    7.4散列表的查找 7.4.1散列表的基本概念 基本思想:记录的存储位置域之间存在对应关系 ​ 对应关系——hash函数 ​ Loc(i)= H(keyi) 如何查找 : 根据散列函数 H(key) = k 查找key=9,则访问H(4)= 18号地址,若内容为18则成功; 若查不到,则返回一个特殊值,如空指针或

    2024年02月12日
    浏览(38)
  • R语言数据结构-----列表

    目录 (1)创建列表  (2)列表索引 (3)增加或删除列表元素 (4)访问列表元素和值 (5)apply()函数 (6)递归型列表 列表的基本操作 函数hist()中的数据,也是通过列表保存的 (1)创建列表  (2)列表索引 (3)增加或删除列表元素 添加新的组件 使用索引添加组件 删除

    2024年02月08日
    浏览(42)
  • 数据结构——散列函数、散列表

    散列表的基本概念 散列函数的构造方法 处理冲突的方法 散列查找及性能分析 提示:以下是本篇文章正文内容,下面案例可供参考 概念:之前的算法建立在“比较”基础上,效率取决于比较次数 散列函数:将映射成该对应地址的函数,记为Hash(key)=Addr,散列函

    2024年02月07日
    浏览(41)
  • Linux内核数据结构 散列表

    在Linux内核中,散列表(哈希表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和散列表相关的数据结构有两个: hlist_head 和 hlist_node 对应的结构如下 hash_table 为散列表(数组),其中的元素类型为 struct hlist_head 。以 hlist_head 为链表头的链表,其中的节点 hash 值

    2024年02月10日
    浏览(37)
  • 数据结构——带头节点的双向循环列表

    带头节点的双向循环链表 是一种特殊的双向链表,它与普通的双向链表相比,最大的区别是链表头结点的 next 指针不再指向第一个实际节点,而是指向链表中的第一个节点。同时,链表尾结点的 prev 指针也不再指向 NULL,而是指向链表中的最后一个节点。 另外, 带头节点的

    2024年02月11日
    浏览(45)
  • 【数据结构】——查找、散列表的相关习题

    1、顺序查找适用于存储结构为()的线性表。 A、顺序存储结构或者链式存储结构 B、散列存储结构 C、索引存储结构 D、压缩存储结构 解析: (A) 顺序查找 属于线性查找,从线性表的一端开始,依次检查所给定的是否满足条件,若找到符合条件的元素,则查找成功

    2024年02月04日
    浏览(46)
  • 数据结构算法设计——哈希表(散列表)

            哈希表 又叫 散列表 ,他们两个是同一个东西,本文全文采用“散列表”的叫法。散列表的本质其实就是一个 数组 ,他的作用就像使用数组时一样,输入下标可以得到对应元素,散列表可以实现 输入一个的时候得到这个的地址信息 。 下面是百科给出

    2024年02月03日
    浏览(59)
  • Python列表:灵活多变的数据结构

    在Python 3中,列表是一种有序的集合,它包含了多个元素并且每个元素可以是任意类型的数据。列表使用方括号 [ ] 来表示,其中的元素由逗号 , 分隔开。 首先,我们可以创建一个空的列表: 然后,我们创建一个包含多个元素的列表 序列中的每个值都有对应的位置值,称之为

    2024年02月21日
    浏览(41)
  • Redis核心数据结构之压缩列表(一)

    压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。 例子 例如,执行以下命令将创建一个压缩列表实现的列表键,列表键

    2024年03月16日
    浏览(37)
  • Redis数据结构——快速列表quicklist、快表

    Redis中的数据结构,链表和压缩列表这两种数据结构是列表对象的底层实现方式。 当时考虑到链表的附加空间太大,节点的内存都是单独分配的,还会导致内存碎片化问题严重。 因此从Redis3.2开始,对列表的底层数据结构进行了改造,即使用 quickList代替链表list和压缩列表z

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包