当前位置: 首页 > news >正文

了解哈希表

哈希表(Hash Table)详解

哈希表(Hash Table)也被叫做散列表,用于存储键值对(key-value pairs),它是一种借助哈希函数(Hash Function)来实现键值对高效存储与查找的数据结构。其工作原理是通过哈希函数将键(key)映射到表中特定位置来实现快速的数据访问。

一、核心概念

  1. 哈希函数:它能够把键映射成数组的索引。理想情况下,不同的键会被映射到不同的索引位置。通俗来讲就是:将任意大小的数据经过函数计算输出一个固定大小的值,这个值就叫做哈希值。

    • 输入:键(key)
    • 输出:哈希值(通常是一个整数,作为数组索引)
  2. 数组结构:用于实际存储键值对数据,这个数组也被称作 “桶”(Bucket)或者 “槽”(Slot)

  3. 哈希冲突(Collision):当不同键被映射到同一位置时发生的情况

工作原理

基本操作

  1. 插入数据:

    • 通过哈希函数计算出键对应的的哈希值 → 确定存储位置 → 存入该位置
      在这里插入图片描述
  2. 查找数据:

    • 通过相同的哈希函数计算键的哈希值 → 定位到存储位置 → 取出数据
  3. 删除数据:

    • 依据哈希函数找到索引 → 接着移除该位置的键值对

哈希冲突解决方法

当两个不同的键经过哈希函数计算后得到相同的索引时,就会产生冲突,解决冲突的常见方法有:

  1. 链地址法(Separate Chaining)

    • 每个桶(数组/槽)的位置存储一个链表
    • 冲突的元素被添加到链表中
    • 示例:Java的HashMap
  2. 开放地址法(Open Addressing)

    • 若某个位置已被占用,就按照一定的规则(像线性探测、二次探测等)寻找下一个空闲位置。
    • 线性探测:冲突后顺序查找下一个空槽
    • 二次探测:按平方数跳跃查找
    • 双重哈希:使用第二个哈希函数

哈希表的特性

  • 平均时间复杂度

    • 在哈希函数设计良好且负载因子适中的情况下,哈希表插入、查找和删除操作的平均时间复杂度为 O (1)。
    • 插入:O(1)
    • 查找:O(1)
    • 删除:O(1)
  • 最坏情况时间复杂度

    • 在最坏的情形下(所有键都映射到同一个位置),时间复杂度会退化为 O (n)。
    • O(n)(当所有键都冲突时)
  • 空间复杂度:O(n)

实际应用

  1. 数据库索引
  2. 缓存实现(如Redis)
  3. 语言中的字典/集合(Python的dict/set,Java的HashMap/HashSet)
  4. 编译器符号表
  5. 路由表

Python中的实现示例

nums = [1,3,3]
target = 6
hashtable = dict() # 创建一个哈希表
for i, num in enumerate(nums):if target - num in hashtable:print([hashtable[target - num], i])hashtable[nums[i]] = i

哈希表的关键考量

  1. 好的哈希函数应该

    • 计算快速(小的空间效率:链地址法在冲突较多时会消耗更多的空间)
    • 均匀分布键(减少冲突)
    • 确定性(相同键总是产生相同哈希值)
    • 扩容操作:当负载因子超过阈值时,需要扩大数组容量并重新进行哈希计算。
  2. 负载因子(Load Factor)

    • 负载因子的计算公式是:存储的键值对数量除以数组的大小。当负载因子过高时,冲突发生的概率会增加,此时就需要对哈希表进行扩容操作。
    • 元素数量/桶数量
    • 通常当负载因子超过0.7时需要扩容

哈希表是现代编程中最重要的数据结构之一,因其高效的查找性能而被广泛应用。

http://www.xdnf.cn/news/662023.html

相关文章:

  • Haproxy编译安装
  • 【MogDB】测试 ubuntu server 22.04 LTS 安装mogdb 5.0.11
  • ceph osd 无法启动
  • 安装conda
  • 如何查看 GitLab 内置的 PostgreSQL 版本?
  • 记录一个有用的tcpdump命令
  • Veeam Backup Replication Console 13 beta 备份 VMware esxi
  • Redis 中跳表
  • 从“无我”到“无生法忍”:解构执着的终极智慧
  • (vue)vue3+vite+ts项目router路由添加
  • 项目管理进阶:详解项目管理办公室(PMO)实用手册【附全文阅读】
  • Vuex Actions: 异步操作
  • LVGL显示其他大小的中文
  • AE THYRO-AX 功率控制器 THYRISTOR-LEISTUNGSSTELLER THYRISTOR POWER CONTROLLER
  • NumPy 2.x 完全指南【十九】广播机制
  • Windows 拓展Path环境变量
  • uniapp 搭配uviwe u-picker 实现地区联栋
  • ETL 工具与数据中台的关系与区别
  • 1.6 如何使用命令行执行 TypeScript 文件
  • Transformer,多头注意力机制 隐式学习子空间划分
  • JAVA Zip导入导出实现
  • 20250526给荣品PRO-RK3566的Android13单独编译boot.img
  • Python程序中字符串与JSON转换的最佳实践详解
  • Java 杂谈
  • 记一个小问题:Cookie 作用域规则
  • Dify中的Agent策略插件开发例子:以Function Calling为例
  • 重磅升级!Docusign IAM 2025 V1 版本上线,重塑智能协议新体验
  • Windows逆向工程提升之IMAGE_RUNTIME_FUNCTION_ENTRY
  • 按键状态机
  • FFmpeg 4.3 H265 二十二.3,avformat_open_input 支持打开的协议