哈希表

哈希表是一种实现理想查询时间复杂度为O(1)的数据结构。通过哈希函数将数据映射到表中,实现快速查找。文章介绍了哈希的基本概念、例子、构建方法,包括直接定制法和除留余数法。此外,文章还讨论了哈希冲突及其解决方法,如线性探测、二次探测和开散列。最后,提到了哈希桶作为解决冲突和提高效率的优化手段。
摘要由CSDN通过智能技术生成

哈希表

在之前实现的数据结构中,查找一个数据在顺序表中的时间复杂度为O(n),平衡二叉树时间复杂度比较低为O(logn)。但是理想状态下的数据的查询为O(1),有没有数据结构能够实现?

从标题就知道哈希表能够实现目标,今天要介绍的数据结构是哈希表,但是在介绍之前,先介绍哈希。

哈希是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。通过映射的方式将数据存在表中,取出数据,只要找到映射的表中的位置就能实现时间复杂度为O(1)的数据查询。

看完上面的说法读者可能没有明白,下面用一个例子来说明哈希的思想

例子

在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。返回重复了 N 次的那个元素。

在这里插入图片描述

题目还是很容易理解的,看完题目后,我们尝试用哈希的思想解这道题。

class Solution {
public:
    int repeatedNTimes(vector<int>& A) {
       vector<int> a;//用vector记录出现的次数
        a.resize(100);
        for(int i=0;i<A.size();i++)
        {
            a[A[i]] +=1 ;//A[i]为数据的键值
        } 
        
        for(int i=0;i<a.size();i++)
        {
            
            if(a[i] == A.size()/2)
                return i;
        }
        return -1;
    }
};

对照代码,我们实现了哈希映射的思想,每一个元素的值都对应表中的地址,出现一次在表中地址++,最后遍历表,找出符合条件的元素。
在这里插入图片描述

哈希的构建方法

在上面的例子中我们已经了解了哈希的思想,但是上面的方法有一个很大的缺点,假设有两个数字,1,10000传入哈希表中做映射,难道要开10000个空间,中间的空间都浪费
例子使用的方法叫做直接定制法,直接开辟足够的空间进行映射, 优点:简单、均匀 缺点:需要事先 知道关键字的分布情况。
针对直接定制法的不足,又引申出了除留余数法,思想如下。
在这里插入图片描述
首先开辟5个单位大小的表,传入数据[1,52],将1对应的地址的值+1,针对52首先将52与5做余运算,得到的结果作为表中的地址储存。
算上直接定制法,一共有6种方法分别是:

  • 直接定制法–(常用)

取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先 知道关键字的分布情况 使用场景:适合查找比较小且连续的情况

  • 除留余数法-–(常用)

设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函 数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址 (常用)

  • 平方取中法--(了解)

假设关键字为1234,对它平方就是1522756,抽取中间的3位227作为哈希地址; 再比如关键字为 4321,对它平方就是18671041,抽取中间的3位671(或710)作为哈希地址 平方取中法比较适合:不知 道关键字的分布,而位数又不是很大的情况

  • 折叠法–(了解)

折叠法是将关键字从左到右分割成位数相等的几部分(最后一部分位数可以短些),然后将这几部分叠加 求和,并按散列表表长,取后几位作为散列地址

  • 随机数法–(了解)

选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key) = random(key),其中random为 随机数函数。

  • 数学分析法–(了解)

设有n个d位数,每一位可能有r种不同的符号,这r种不同的符号在各位上出现的频率不一定相同,可能 在某些位上分布比较均匀,每种符号出现的机会均等,在某些位上分布不均匀只有某几种符号经常出 现。可根据散列表的大小,选择其中各种符号分布均匀的若干位作为散列地址。例如身份证号码的前几位相同,只把最后几位作为散列地址。

上面的方法除了直接定制法和除留余数法比较常用,其他的作为了解的知识即可。
不要以为讲完上面的知识,哈希表就完了,以除留余数法为例,在刚才的表中假如我们传入了[1,51,251]会怎么样?
在这里插入图片描述
1,51,251经过计算后的散列地址相同,这种情况就是我们接下来要讲的哈希冲突

哈希冲突及其解决方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值