P1 哈希表和哈希函数介绍

   

哈希表   

       什么是哈希表(hash function)?给定表M,若存在函数h(key),使得对任意给定的关键字值key,代入函数后能得到包含该key的记录在表中的地址,则称表M为哈希表(hash table)。函数h(key)为哈希函数或者散列函数。哈希函数的好坏会直接影响哈希表的优劣。

       散列表是使用哈希函数和数组共同构建的一种数据结构,由键和值组成,她使用哈希函数来确定元素存储位置。散列表中的一个位置称为槽位(slot)或者桶(bucket),用于保存键值对。数组索引即为桶号,决定了给定的键存于散列表的哪个桶中。散列表所拥有的桶数被称为散列表的容量(capacity)。由哈希函数决定的存储位置称为散列地址。举个例子,比如我们要在哈希表中执行插入操作:

 

       如果不同的key映射到了相同的哈希值,则出现了哈希碰撞。

       图中,0-5标记部分即代表哈希表,数组的每个元素都是一个单链表的头节点,链表是用来解决哈希碰撞的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。例如,关键字key=kobe,通过哈希函数f(key)得到其哈希值为1,故把kobe放在数组下表索引为1的桶中。

四种数据结构

       为了便于理解散列表,下面粗略地介绍下四类数据结构在新增,查找等基础操作中的执行性能。

       数组:存储区间连续,占用内存严重,寻址容易,插入删除困难;对于指定下标的查找,复杂度为O(1);对于给定值进行查找,需要遍历数组,复杂度为O(n),对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)。

       线性链表:存储区间散列,占用内存比较宽松,寻址困难,插入容易。对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)。

       二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。

       哈希表(Hash table,也叫散列表):相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,复杂度为O(1),接下来我们就来看看哈希表是如何实现达到惊艳的常数阶O(1)的。

 

猜你喜欢

转载自www.cnblogs.com/east7/p/12594212.html