数据结构之hash表

基本概念

哈希表(Hash table,也称散列表),是根据关键码(key)直接访问内存存储位置的数据结构。即通过关于key的函数,从而映射到一个地址来访问数据。这样可以加快查找速度。
这个关于key的映射函数称作哈希函数(散列函数),存放数据记录的数组称为哈希表(散列表)。哈希表以数组形式存储。

hash冲突

不同关键码通过哈希函数生成的散列地址可能会出现相同的情况,这种情况称为hash冲突,hash冲突不可避免,只能通过优化hash函数尽量减少hash冲突。下面是一些hash冲突的处理方法。

单独链表法(Seperate Chaining)

主要思想:使哈希表的每个单元 指向具有相同哈希函数值记录 的单链表中

开放定址法(Open Addressing)

主要思想:所有元素存储在哈希表本身中。当遇到冲突时,通过某种探测方式,找到合适的位置操作。所以哈希表在开始就创建了所有单元。
主要探测方法有线性探测法、线性补偿探测法、随机探测法

  1. 线性探测法。按照顺序来,假如冲突下标为i,那就存到i+1,如果i+1不为空,则尝试i+2。。。一直找到空位置位置,没有空位则扩容。查找key时,先找到key对应的下标,比较找到的下标对应的key和原key是否相同,相同则取出来,不同则按顺序比较每个单元的key,如果遇到空位置还没找到则说明不存在该值
  2. 二次方探测。在1的基础上,将每次移动的间隔由1变为i的平方。
若单元f(x)%S已有数据,则尝试(f(x)+1*1)%S;
若单元f(f(x)+1*1)%S已有数据,则尝试(f(x)+2*2)%S;
若单元f(f(x)+2*2)%S已有数据,则尝试(f(x)+3*3)%S; 依次类推。
  1. 双重hash。使用另一种哈希函数f2(k),间隔为i*f2(x)。
若单元f(x)%S已有数据,则尝试(f(x)+1*f2(x)%S;
若单元f(f(x)+1*f2(x))%S已有数据,则尝试(f(x)+2*f2(x))%S;
若单元f(f(x)+2*f2(x))%S已有数据,则尝试(f(x)+3*f2(x))%S; 依次类推。
posted @ 2022-09-06 15:27  北冥虾  阅读(98)  评论(0编辑  收藏  举报