美文网首页
数据结构之散列表

数据结构之散列表

作者: 过期的薯条 | 来源:发表于2017-10-12 23:06 被阅读14次

1.前言

以前看hashmap的原理看了很多次,过了很久都忘记了。真心发现以前的看书方法不对。感觉学习还是要靠背书。这节 好好的踏实的把散列这届记录下。

2.正题

散列函数:
将关键字(key) 映射成0--tablesize-1 这个范围中的某一个数,然后放到适当的单元中。这个映射就叫做“散列函数”。

冲突: 俩个或者多个关键字散列到同一个单元的时候。就会产生冲突。

装填因子:散列表的元素个数 比上 tablesize 得到的值,为装填因子。

通常对于key为String的 关键字来说。一种方法就是将String 的每个字符,转换成Ascll码。然后累加。之后在%tablesize。(tablesize 不能为素数)。

还有一种散列函数没搞明白,就不记录了。。

介绍完了散列函数。那么就来写下 如何解决冲突问题

1.分离链接法

image.png

在冲突的地方,加入一个单向链表。如何待插入的数据是一个新数据的时候,那么它将被插入链表的前端。不仅因为方面。更是因为最新插入的数据最有可能被用到。

当进行插入的时候。发现链表中有之前的一摸一样的key。那么就会替换掉oldValue:

image.png

问题1:hashmap为什么是无序的?
因为它是通过散列函数,映射得到数组的下标的。所以是无序的。

问题2:hashmap在多线程的情况下,是不安全的
hashmap 的源码是没有假如任何的锁机制。多线程的情况下。假设新插入的元素都是无重复的。那么在多线程的情况下,最后一个线程插入的数据,会覆盖之前插入的数据。所以链表的第一个数组,是最后一个线程的数。

缺点:由于给新单元分配地址需要时间,导致算法速度有些慢。

2.线程探测法
探测性散列表的table 要大于 分离链接法。一般来说 探测性散列表的装填因子<0.5。

线性探测法:以增量序列1,2,......,(TableSize-1)循环试探下一个存储地址

image.png

一次聚集现象:如上图的表插入30 之后。明显右边的数据要密集些。左边的数据要稀疏一点。这样的现象就叫做 聚集现象。

缺点: 当表很大的时候,出现聚集情况,会导致新插入的数据要和每个单元进行比较。插入不成功的情况大大增多。

3.平方探测法
针对线性探测法的缺点,伟大的算法工程师,又想出了 平方探测法,来解决线性探测法的聚集现象。

缺点:产生二次聚集。

3.LinkHashMap
LinkedHashMap采用的hash算法和HashMap相同,但是它重新定义了数组中保存的元素Entry,该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。参考http://wiki.jikexueyuan.com/project/java-collection/linkedhashmap.html

LinkHashMap 链表部分 采用了双向链表。保证了插入顺序和访问顺序。

插入顺序

image.png

访问顺序

image.png

相关文章

  • 学习JavaScript数据结构与算法(第2版)

    二维和多维数组 栈数据结构 队列数据结构(排队) 链表数据结构 双向链表 集合 字典和散列表 散列表 树 二叉树 ...

  • 数据结构之散列表

    1、散列函数 原则 一致性 高效性 均匀性 定义 1.散列函数计算得到的散列值是一个非负整数。2.若key1=ke...

  • 数据结构之散列表

    1.前言 以前看hashmap的原理看了很多次,过了很久都忘记了。真心发现以前的看书方法不对。感觉学习还是要靠背书...

  • 数据结构之散列表

    需求场景 散列表一种经典的查找的算法,应用于在海量信息中进行高效检索。 简单需求 假设我们需要把10000000个...

  • 数据结构之散列表

    散列表也叫作哈希表(hash table),这种数据结构提供了键(Key)和值(Value)的映射关系。只要给出一...

  • 算法图解-散列表

    1. 散列表 散列表由键和值组成,散列表将键映射到值。 在复杂数据结构中,散列表可能是最有用的,也被称为散列映射、...

  • 散列表

    什么是散列表 散列表也叫哈希表,输入某一关键字输出其对应的数值的数据结构 散列表的生成依赖于散列函数,散列函数的要...

  • 散列表下

    为什么散列表和链表经常会一起使用? 散列表这种数据结构虽然支持非常高效的数据插入、删除、查找操作,但是散列表中的数...

  • 散列表下

    为什么散列表和链表经常会一起使用? 散列表这种数据结构虽然支持非常高效的数据插入、删除、查找操作,但是散列表中的数...

  • 基础概念

    散列表 散列表是一种将键(Key)映射为值(Value)从而快速查找的数据结构 散列表包含一个底层数组和一个散列函...

网友评论

      本文标题:数据结构之散列表

      本文链接:https://www.haomeiwen.com/subject/obxayxtx.html