散列表

  • 前言
  • 一、什么是散列表
  • 二、HashMap
  • 三、散列表原理
  • 四、散列函数的设计
  • 五、解决散列冲突的方法
    • 1、开放寻址法
    • 2、链表法
  • 总结

前言

散列表也叫哈希表,是根据键值对(key,value)进行访问的一种数据结构。他是把一对(key,value)通过key的哈希值来映射到数组中的,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。


一、什么是散列表

散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。

二、HashMap

散列表中最常见的应该就是HashMap了,HashMap的实现原理非常简单,他其实就是数组加链表的一种数据结构。如果映射在数组中出现了冲突,他会以链表的形式存在。我们来看一下他的数据结构是什么样的。

数组的长度即是2的n次幂,而他的size又不大于数组长度的75%。
HashMap的实现原理是先要找到要存放数组的下标,如果是空的就存进去,如果不是空的就判断key值是否一样,如果一样就替换,如果不一样就以链表的形式存在。

三、散列表原理

散列表用的就是数组支持按照下标随机访问的时候,时间复杂度是0(1)的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函数,将键值转化数组标标,从对应的数组下标的位置取数据。

四、散列函数的设计

散列函数计算得到的散列值是一个非负整数;.
如果key1 = key2,那hash(key1) == hash(key2);
如果key1 != key2,那hash(key1) != hash(key2),
散列函数的设计不能太复杂,散列函数生成值要尽可能随机并且均匀分布

如果不符合3 那么就出现了散列冲突,散列冲突是无法避免的

五、解决散列冲突的方法

1、开放寻址法

开放寻址法:如果出现了散列冲突,我们就重新探测一个空闲位置,将其插入。
举个例子
哈希表中已经插入8、9元素,此时再插入14,下标2已经被8给占用了,出现哈希冲突。
线性探测会环形寻找next节点,先找到下标3,被9占用了,依然冲突,再找到下标4,没有被占用,即没有发生冲突,则将14放入下标4的节点中。

装在因子: 散列表中一定比例的空闲槽位。公式: 散列表的装载因子 = 填入表中的元素个数 / 散列表的长度

装载因子越大,说明空闲位置越少,冲突越多,散列表的性能会下降。
开放定址法的优点
只要哈希表还有位置,通过不断的探测,总能找到合适的位置。
开放定址法的缺点
探测的次数不可控,一旦探测次数骤增,会严重影响哈希表的读写性能。

2、链表法

链表法是一种更加常用的散列冲突解决办法,相比开放寻址法,它要简单很多。我们来看这个图,在散列表中,每个"桶(bucket) "或者"槽(slot) "会对应一条链表,所有散列值相同的元素我们都放到相同槽位对应的链表中。

将哈希码对应一个链表,插入元素时,如果哈希码冲突了,就将元素插入到链表,可选头插或尾插。查询时,遍历哈希码对应的链表。HashMap采用的就是这种方式。

优点

  1. 内存利用率比开放寻址法要高,链表结点可以在需要的时候再创建
  2. 对大装载因子容忍度更高,只要散列函数的值随机均匀,即使装载因子变成 10,也就是链表的长度变长了而已

缺点

  1. 存储小对象需要额外的指针,比较耗内存,但对于大对象则可以忽略
  2. 链表分散存储,无法利用 CPU 缓存


总结

数组的特点是「访问简单,插入删除困难」,链表的特点是「访问困难,插入删除简单」。散列表在某种程度上融合了二者的优点,可以说散列表是升级后的数组。散列表通过给元素生成一个哈希码来加速访问效率,因为哈希冲突的存在,在发生冲突时散列表可以将元素节点转换成链表,将冲突的元素放到一根链上。
转换成链表是为了解决哈希冲突不得已而为之的办法,为了保证散列表的性能,开发者需要尽量避免哈希冲突,严格控制链表的长度,一旦退化成链表,数据访问的效率将从O(1)下降到O(n)。

数据结构与算法--散列表相关推荐

  1. 数据结构与算法 / 散列表(HashTable)

    一.散列思想 通过散列函数通过 Key 值计算得出数组下标,然后利用数组支持下标随机访问的特性,在时间复杂度为O(1)的情况下找到所需要的信息. 散列函数Key -------------> 散 ...

  2. 学习JavaScript数据结构与算法 — 散列表

    定义 散列表是字典(键.值对)的一种实现方式.每次在字典中获取一个值,都需要重复遍历字典,如果用散列表,字典中的每个key都对应一个确定的位置,从而不再需要遍历. 以电子邮件地址簿为例,每个名字(ke ...

  3. 数据结构与算法文章列表

    前言 数据结构与算法文章列表主要内容包括:稀疏数组.单向队列.环形队列.单向链表.双向链表.环形链表.约瑟夫问题.栈.前缀.中缀.后缀表达式.中缀表达式转换为后缀表达式.递归.迷宫问题.八皇后问题.散 ...

  4. 高速缓存的数据结构:拉链散列表

    高速缓存的底层数据结构:拉链散列表,很多bucket,挂了很多cache entry(tag + cache line + flag). cache line就是缓存的数据,包含多个变量的值 tag指 ...

  5. python中的列表是采用链式结构实现的_Python数据结构与算法之列表(链表,linked list)简单实现...

    Python数据结构与算法之列表(链表,linked list)简单实现 Python 中的 list 并不是我们传统(计算机科学)意义上的列表,这也是其 append 操作会比 insert 操作效 ...

  6. 【数据结构】回顾散列表

    1.散列表(hash table)的实现成为散列(hashing),是一种以常数平均时间执行输入.删除和查找的技术.但是那些需要元素间任何排序信息的数操作将不会得到有效的支持. 2.散列函数示例 in ...

  7. 数据结构--hashtable(散列表)

    散列 散列又叫hash.是通过关键字把数据映射到指定位置的一种数据结构.理想的散列表,是一个包含关键字的固定大小的数组 哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关,哈希表在查找元素时是 ...

  8. 用js来实现那些数据结构12(散列表)

    上一篇写了如何实现简单的Map结构,因为东西太少了不让上首页.好吧... 这一篇文章说一下散列表hashMap的实现.那么为什么要使用hashMap?hashMap又有什么优势呢?hashMap是如何 ...

  9. 《数据结构与算法》(二十)- 散列表查找

    目录 前言 1. 散列表查找(哈希表)概述 1.1 散列表查找定义 1.2 散列表查找步骤 2. 散列函数的构造方法 2.1 直接定址法 2.2 数字分析法 2.3 平方取中法 2.4 折叠法 2.5 ...

最新文章

  1. python科学计算基础教程pdf下载-Python科学计算 PDF 第2版
  2. 2台xenserver组成的资源池开启HA存在的问题
  3. kafka安装_安装Kafka
  4. selenium webdirver之rdoc使用
  5. 职业教育计算机课教学反思,关于高职计算机基础课的教学反思.doc
  6. 中药ppi网络图太杂乱_太杂乱了吗? 这是您的iPhone,iPad,Android或台式机的15张简约壁纸...
  7. phpcms前台注入导致任意文件读取漏洞
  8. java+串行和并行的区别_Java8新特性_并行流与串行流
  9. ma5200g启用mpls l2***故障处理一则
  10. 自己动手实现STL 02:构造析构的基本工具construct()和destroy()(stl_construct.h)
  11. mysql dba命令_MySQL DBA命令
  12. 3-8-循环队列-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
  13. 不拦截Request!基于WKWebView的API实现Hybrid容器
  14. classes是什么意思怎么读_classes怎么读用法大全_classes是什么意思
  15. 光谱分辨率单位_遥感图像的空间分辨率,光谱分辨率,辐射分辨率,时间分辨率...
  16. matlab生成Z为常数的.grd格式数据
  17. Qt自定义控件--QQ表情
  18. 香坊区开启“三位一体”智慧城管新模式
  19. Java基础语法-数据类型与idea配置
  20. linux下的外接显示器设置成竖屏

热门文章

  1. Unity 碰撞距离设定
  2. java通过aspose实现文档间格式转换
  3. 【01】什么是 APP?移动 APP 有几种类型?
  4. linux 模拟器安卓版下载,ONS模拟器下载
  5. excel运行时出现正在等待其他应用程序的OKE操作完了
  6. 关于windows server 2016服务器 exchange 2010 managment Shell 停止工作的问题(已解决)
  7. 在UNIX \ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex
  8. tensorflow框架下,多进程model.predict(x)无响应/暂停/无输出
  9. 黄金圈理论和知识体系
  10. 程序设计C实验二题目一计算员工周工资