哈希表
哈希表只是一种数据的组织形式,以键值对的方式的一种数据储存形式,但是有不同的实现
基于数组的实现是,首先数组的索引与值。就是一种比数组和链表在一些方面,增删改查数据,更具有优势,效率更加高,
也是输入index就能快速的得到对应index的value,其实现原理是,首先通过输入的值与哈希算法计算出来一个hash值,将哈希值对数组的长度(capacite)取模,去访问哈希表里对应的桶,从这个桶里面,然后快速的找到对应index的value。
哈希表,的底层是有一个输入空间和有一个输出空间,往往,输出空间,即要少于输入空间,由于这个原因,不同的输入的值就可能会出现相同的值,即哈希冲突,
负载因子 Load Factor」是哈希表的一个重要概念,其定义为哈希表的元素数量除以桶数量,用于衡量哈希冲突的严重程度,也常被作为哈希表扩容的触发条件。例如在 Java 中,当负载因子超过 0.75 时,系统会将哈希表容量扩展为原先的 2 倍。
为了解决哈希冲突,可以从扩大输出空间入手,但是,由于现实成本的限制,不可能在一开始,输出空间被搞的无限大,即出现了基于链表的哈希表
链式地址,将单个元素转换链表,将键值对作为链表节点,将发生冲突的键值对都储存在同一链表中
链式地址下,哈希表的操作方法包括:
- 查询元素:输入 key ,经过哈希函数得到数组索引,即可访问链表头节点,然后遍历链表并对比 key 以查找目标键值对。
- 添加元素:先通过哈希函数访问链表头节点,然后将节点(即键值对)添加到链表中。
- 删除元素:根据哈希函数的结果访问链表头部,接着遍历链表以查找目标节点,并将其删除。
注:本文图片来源于Hello算法中,