当前位置:   article > 正文

链表-哈希表 详解_哈希链表

哈希链表

链表

链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item指向一下个节点的指针next
通过节点之间相互连接,最终串联成一个链表。

链式存储结构就是 两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针。

优缺点

优点:

  1. 插入和删除的时间复杂度为O(1);
  2. 动态地进行存储分配,可以适应数据动态地增减的情况,节约内存

缺点:

  1. 查找效率低,需要从头依次查找链表的每一项。 [访问的时间复杂度最坏为O(n),关于查找的算法很少一般只能遍历]
  2. 频繁的申请和释放内存也会消耗时间。
  3. 插入和删除中间位置时要重头找到对应的数据

链表分类

【单向链表】

链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值。
在这里插入图片描述)

【双向链表】

双向链表的指针域有两个指针,每个数据结点分别指向直接后继和直接前驱。
在这里插入图片描述

循环链表

循环链表就是让链表的最后一个节点指向第一个节点,这样就形成了一个圆环,可以循环遍历。(单向循环链表,双向循环链表

在这里插入图片描述

哈希表

能够具备 数组的快速查询 的优点又能融合 链表方便快捷的增加删除元素 的优势。

所谓的hash,简单的说就是散列,即将输入的数据通过hash函数得到一个key值,输入的数据存储到数组中下标为key值的数组单元中去,这个映射函数叫做散列函数,存放记录的数组叫做散列表

· insert(key, value):插入键值对(key,value)
· get(key): 如果存在键为key的键值对则返回其value, 否则返回空值
· delete(key): 删除键为key的键值对

优缺点

优点: 插入/查询/删除效率非常高

缺点:

  1. 空间利用率不高,底层使用的是数组,并且使用的某些单元是没有被利用的;
  2. 哈希表中的元素是无序的,不能按照固定的顺序来遍历哈希表中的元素;
  3. 不能快速的找出哈希表中的最大值或者最小值;

HASH冲突

不相同的数据通过hash函数得到相同的key值。这时就产生了hash冲突。解决hash冲突的方式有两种:

1.开放寻址法

开放寻址法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。
就是说当发生冲突时,就去寻找下一个空的地址把数据存入其中,只要哈希表足够大,就总能找到这样一个空的地址。

线性探查:如果位置i被占用,则探查i+1, i+2,……
二次探查:如果位置i被占用,则探查i+12,i-12,i+22,i-22,……
二度哈希:有n个哈希函数,当使用第1个哈希函数h1发生冲突时,则尝试使用h2,h3,……

2.拉链法

拉链法:哈希表每个位置都连接一个链表,当冲突发生时,冲突的元素将被加到该位置链表的最后。
在这里插入图片描述

3.再哈希法

在发生冲突的时候再用另外一个哈希函数算出哈希值,直到算出的哈希值不同为止。

4.建立公共溢出区

在创建哈希表的同时,再额外创建一个公共溢出区,专门用来存放发生哈希冲突的元素。查找时,先从哈希表查,查不到再去公共溢出区查。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/396163
推荐阅读
相关标签
  

闽ICP备14008679号