哈希表的基本知识

基础知识

哈希表(Hash Table)又被称为散列表,是通过键值直接访问数据的一种数据结构,数组就是一种常见的哈希表,因为可以通过下标来访问数据。哈希表常被用于查找元素是否存在。例如查询通讯录的人名是否存在,如果用枚举的方式,时间复杂度是O(n)。如果使用哈希表,时间复杂度就会降低到O(1)。
哈希表一般是通过映射的方式进行查询的,仍以人名为例,可以通过hashCode将名字转化成表中的数字。但是哈希表的长度是固定的,为了让每次映射的值都映射在哈希表上,通常会采取取模的处理。

哈希碰撞

但是仍会出现哈希表放不下的情况,例如不同的值映射到同一片区域,称为哈希碰撞。解决哈希碰撞的常用方法就是拉链法和线性探测法。

拉链法

顾名思义,如果不同的值映射到同一个位置,可以将该位置想象成一个链表,将不同的值都存放在同一位置的链表中,看起来就像拉链一样。拉链法要注意的就是要选择合适大小的哈希表,这样既不会占用过多的空间,也不会是链表过长。
哈希表的基本知识_第1张图片

线性探测法

使用线性探测法,就需要是哈希表的大小大于数据的大小,线性探测法的原理是如果映射到相同位置,就移动到下一个空位置存放,来解决哈希冲突。

常见的哈希结构

常见的哈希结构分为三种:数组、set(集合)、map(映射)
其中set和map的种类及优劣程度如下表所示:
哈希表的基本知识_第2张图片
哈希表的基本知识_第3张图片
其中红黑树是一种平衡二叉树,所以是有序的,改变k值会破坏树的平衡性,所以只能插入和删除。set的使用场景和数组类似,一般是判断元素是否在集合中。map的使用场景就是不但要找到值,还有值的下标,例如力扣的两数之和。

你可能感兴趣的:(数据结构,c++)