哈希表(散列表)
* 散列的思想,就是用key对应着一个value。将key转换为value的方法叫做散列函数,而散列函数得到的value就是散列值,
* 散列值也叫做哈希值。这个value就对应着数组的下表,然后根据value去数组中对应的位置存取数据。
*
* 散列函数,hash(key),其中key表示着元素的键值,has(key)-》value就是经过散列函数计算得到的散列值(哈希值)。
*
* 散列函数设计的基本要求
* a.散列函数计算得到的散列值是一个非负整数
* b.如果key1 = key2 ,has(key1) = has(key2)
* c.如果key1 != key2,has(key1) != has(key2)
*
*
* 散列冲突:就是两个不同的key 得到了一样的哈希值,就是散列冲突。
*
* 常用的解决散列冲突的方法
*
* (一) 开放寻址法:如果出现了散列冲突,重新探测一个空闲位置,将其插入。适合数据量较少,装载因子比较小的情况
*
* 那么如何来探测是否有空闲位置,先来说一个
*
* (1).线性探测的方法:当我们往散列表中插入数据的时候,如果发生了散列冲突,就从当前位置开始,依次往后面查找,查看是否有空闲位置,直到找到为止。
*
*
*
* 就是当你从散列函数中得到一个哈希值,然后根据这个哈希值去找到数组的下标,发现已经存放数据了,那么就从这个位置开始,按顺序地往后一个一个点着,看还有没有空位置,如果到了数组尾部,
* 还是没有空闲位置,那么就从数组开头再往后查找,直到查找到了一个位置,于是插入元素。
*
*
* 查找的过程也是这样,先通过散列函数求出哈希值,然后对比这个哈希值下标对应位置点数据是否和查找的元素一致,如果相等就找到了,如果不等,就按顺序往后依次查找。
* 如果找到了一个空闲位置还是没有找到这个元素,证明查找元素不在散列表中。
*
* 散列表删除一个元素的时候,不是直接把这个数据从散列表中提出掉,而是将其标志为deleted,当查找一个元素的时候,遇到deleted的元素块点时候,直接往下走,而不是
* 认定为空。
*
*
*
* (2).二次探测的方法:
* 二次探测和线形探测的区别就是,
* 线形探测每次往下走的时候是一步,而二次探测原来的二次方,比如当你遇到了散列冲突,需要往下查找位置插入元素的时候,第一次是hash(key)+0 ,第二次就是hash(key) + 1*1,
* 第三次就是hash(key) + 2*2 ...以此类推
*
JavaScript哈希表
于 2021-11-10 14:02:47 首次发布
本文详细介绍了哈希表(散列表)的概念,包括散列函数的设计要求、散列冲突及其解决方法,如开放寻址法、二次探测和双重散列。此外,还讨论了链表法解决冲突,以及动态扩展散列表大小的策略。哈希表在数据存储、查找、删除等方面的应用被阐述,强调了其在解决数据结构问题中的重要作用。
摘要由CSDN通过智能技术生成