数据结构6-哈希表理论学习

概述

哈希表是一种非常重要的数据结构,基于数组实现。有以下优点

  1. 可以快速的执行插入-删除-查找操作
  2. 速度比树还快,可以瞬间找到想要的元素

一些不足:

  1. 数据没有顺序,不能以固定规则遍历
  2. key值不能重复

所以哈希表,其实就是数组的一种变形,数组以数字来标识下标,而哈希表以哈希函数得到的值做为下标。

场景

  1. 1家公司有10000个员工,如何存储信息,并且需要的时候,查找员工信息

使用数组

插入和删除需要比较大的消耗,查找只能通过其他标识,比如员工编号查找

使用链表

获取只能通过遍历查找,不现实

哈希表

将员工名进行哈希,做为下标,可以很容易实现查找

地址冲突

哈希表是通过将相关信息进行哈希函数,最后得到的值作为地址,存入数据。当要检索数据的时候,通过这个地址可以很快的检索出数据,存入数据的时候,也可以很快的得到地址,直接进行存入。但是会有一个问题,就是计算出来的哈希值地址是重复的。这个时候就要用到下面两个方法解决

  1. 链地址法
  2. 开放地址发

链地址法

如下图codewhy师父所说的,链地址法是一个常见解决冲突的方案,存储在地址上的不是单纯的一个元素,而是一个对象,一个链条,如果发现重复地址,就将元素接在链条后面,查询的时候,查出来的是一个链条,这个时候在通过链条间的遍历,查询数据,这个时候链条使用数组结构或者链表结构都差不多。因为都是遍历的操作。

开放地址法

因为开放地址法,效率并不如链地址法高,所以比较少用,做一下了解
主要有几种方式:

  1. 线性探测: 如果这个地址有数据了,就index+1 查找没有元素的空白地址,进行插入。 容易造成元素聚集,影响性能
  2. 二次探测: 如果这个地址有数据了,就index+1,index+2,index+3 进行探测,有空白地址就进行插入。同样还是会造成元素聚集
  3. 再哈希法:采用另外的哈希函数进行地址的获取。