博客
关于我
数据结构学习笔记 4-2 哈希表与布隆过滤器 与 LeetCode真题(Java)
阅读量:796 次
发布时间:2023-03-25

本文共 1321 字,大约阅读时间需要 4 分钟。

哈希表与布隆过滤器

哈希表是一种基于数组实现的数据结构,能够在平均O(1)时间复杂度内完成插入、删除和查找操作。与传统的数组不同,哈希表的下标可以是任意类型,而不仅仅是整数。为了实现这一点,哈希表使用哈希函数将键转换为一个特定的位置(即哈希值)。

哈希函数

哈希函数的作用是将任意类型的键(如字符串、对象等)映射到一个特定的整数值。常见的哈希函数实现方式包括:

  • 多项式滚动哈希:将键的每个字符依次处理,使用一个固定的多项式系数和一个初始值,按字符依次计算,最后对结果取模。这是一种常用的哈希函数实现方式。
  • 分散哈希:将键的各个部分以不同的方式混合,确保每个键映射到一个独特的位置。
  • 哈希冲突

    在使用哈希表时,可能会出现哈希冲突,即两个不同的键被映射到同一个位置。解决哈希冲突的常见方法包括:

    1. 开放定址法(线性探测法)

    最简单的哈希冲突处理方法是线性探测法。当一个位置已经有元素时,直接将其存入下一个位置。如果下一个位置也存在元素,则继续探测下一个位置,直到找到一个空的位置。这种方法的缺点是当哈希表已接近满载时,查找操作的时间复杂度会从O(1)退化为O(n)。

    2. 再哈希法

    再哈希法使用一组不同的哈希函数来减少冲突的概率。每个键通过多个哈希函数计算得到多个位置中的一个。如果多个哈希函数计算得到的位置都冲突,则将键存入这些位置中的一个。这种方法的缺点是如果多个哈希函数都冲突,仍然可能无法避免冲突。

    3. 建立公共溢出区

    为了减少哈希冲突的概率,可以在哈希表中建立一个溢出区。当哈希表已接近满载时,将冲突的元素存入溢出区。查找操作首先在哈希表中进行,如果找不到元素,则在溢出区中查找。溢出区可以使用堆、红黑树等数据结构。

    4. 链式地址法(拉链法)

    拉链法是最常用的哈希冲突处理方法。每个数组位置存储的是一个链表节点,所有具有相同哈希值的键会存储在对应链表中。当链表长度超过一定阈值时,链表会被转换为红黑树以减少节点数。

    布隆过滤器

    布隆过滤器是一种高效的数据结构,用于快速判断一个元素是否存在。它通过将多个哈希函数的结果存入一个位数组(称为位图),每个位数组元素为二进制位。当多个哈希函数计算得到的位置都为1时,说明该元素存在;否则,说明该元素不存在。

    布隆过滤器的缺点是无法完全避免冲突,但可以通过选择足够多的哈希函数和位数组长度,降低冲突的概率。常见的应用场景包括缓存失效、实时计数等。

    LeetCode题解示例

    经典面试题—哈希结构封装

    题目要求用拉链法实现哈希表的封装。我们需要定义一个Node类来存储链表节点数据和指针。哈希表通过哈希函数计算键的位置,并在链表中插入节点。插入操作需要检查链表中是否有重复的键,如果有,则将其删除并插入到新位置。

    布隆过滤器应用

    在某些题目中,我们可以利用布隆过滤器来实现快速判断。例如,在判断两个字符串是否有公共字符时,可以使用布隆过滤器来快速判断它们是否存在公共字符。

    总结

    哈希表是一种高效的数据结构,广泛应用于缓存、数据库和大数据处理等领域。通过选择合适的哈希函数和冲突处理方法,可以实现高效的数据存取操作。布隆过滤器则为我们提供了一种高效的存在性判断方式,广泛应用于实时系统中。

    转载地址:http://rzhfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现数除以二divideByTwo算法(附完整源码)
    查看>>
    Objective-C实现文件分割(附完整源码)
    查看>>
    Objective-C实现文件拷贝(附完整源码)
    查看>>
    Objective-C实现文件的删除、复制与重命名操作实例(附完整源码)
    查看>>
    Objective-C实现无序表查找算法(附完整源码)
    查看>>
    Objective-C实现无锁链表(附完整源码)
    查看>>
    Objective-C实现无锁链表(附完整源码)
    查看>>
    Objective-C实现时间戳转为年月日时分秒(附完整源码)
    查看>>
    Objective-C实现是否为 Pythagoreantriplet 毕氏三元数组算法(附完整源码)
    查看>>
    Objective-C实现显示响应算法(附完整源码)
    查看>>
    Objective-C实现晚捆绑测试实例(附完整源码)
    查看>>
    Objective-C实现普通矩阵A和B的乘积(附完整源码)
    查看>>
    Objective-C实现更新数字指定偏移量上的值updateBit算法(附完整源码)
    查看>>
    Objective-C实现最大和连续子序列算法(附完整源码)
    查看>>
    Objective-C实现最大类间方差法OTSU算法(附完整源码)
    查看>>
    Objective-C实现最大非相邻和算法(附完整源码)
    查看>>
    Objective-C实现最小二乘多项式曲线拟合(附完整源码)
    查看>>
    Objective-C实现最小值滤波(附完整源码)
    查看>>
    Objective-C实现最小路径和算法(附完整源码)
    查看>>
    Objective-C实现最快的归并排序算法(附完整源码)
    查看>>