数据结构-散列表-概要

散列表(Hash Table)也称哈希表,散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。

散列函数

散列表的核心就是散列函数了,散列函数就是把key值经过某种散列算法后的得到的散列值,记为hash(key)。常见的散列算法有MD5、SHA、CRC等。哈希算法需要满足以下特征1. key可以是任意长度,但是hash(key)之后的散列值其长度是固定的

  1. key1 == key2时,hash(key1) == hash(key2)
  2. 隐匿性,即不能通过hash(key)的值反推出key的值

散列冲突

由于散列函数可能出现key1 != key2时,hash(key1) == hash(key2)的情况,这种情况被称为散列冲突。常见的解决散列冲突的方法主要分为两类

  1. 开放寻址法
  2. 链表法

开放寻址法的主要思想是当发生散列冲突时,我们在数组中再次查找一个空余的位置插入数据。比较简单的方法是线性探测法,即当发生散列冲突时,在当前位置开始,依次向后查找(到尾部了则回到头部)直到查找到空余位置为止。同样,查找动作也是先查看散列值所在位置的key是否和待查找的key一致,不一致的话依次往后查找,直到找到空闲位置为止。删除动作会有点不同,为了查找动作能够顺利进行,删除动作只是标记删除。
可以感知到线性探测法是比较低效的,极端情况下,需要遍历整个数组,时间复杂度为O(n)。除了线性探测法之外,比较常见的探测法还有双重散列法和二次探测法(可以自行搜索)。

相对于开放寻址法,链表法是更常见易用的一种方法。链表法是指当发生散列冲突时,在冲突位置形成链表结构,这个很好理解,就不过多解释了。

你可能感兴趣的:(数据结构-散列表-概要)