大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • 数据结构与算法概述
  • 线性表

    • 线性表 - 基础概念
    • 线性表 - 顺序表
    • 线性表 - 链表
    • 线性表 - 单链表
    • 线性表 - 单向循环链表
    • 线性表 - 双向链表
    • 线性表 - 栈
    • 线性表 - 队列
  • 树

    • 树 - 基础概念
    • 树 - 二叉树基础
    • 树 - 二叉树建立
    • 树 - 二叉树遍历
    • 树 - 树的常见操作
    • 树 - 线索二叉树
    • 树 - 哈夫曼树
    • 树 - 二叉排序树
    • 树 - 平衡二叉树(AVL树)
    • 树 - 红黑树
    • 树 - B树
    • 树 - B+树
    • 树 - B*树
  • 图

    • 图 - 基础概念
    • 图 - 存储方式
    • 图 - 图遍历
    • 图 - 最小生成树
    • 图 - 最短路径
  • 其它数据结构

    • 稀疏数组
    • 哈希表
      • 概念
      • 特点
      • 散列函数
        • 直接定址法
        • 数字分析法
        • 平方取中法
        • 折叠法
        • 除留余数法
        • 随机数法
      • 散列冲突
  • 排序算法

    • 冒泡排序
    • 选择排序
    • 插入排序
    • 希尔排序
    • 基数排序
    • 归并排序
    • 快速排序
    • 堆排序
  • 查找算法

    • 顺序查找
    • 二分查找
    • 插值查找
    • 斐波那契查找
  • 其它算法

  • 数据结构与算法
  • 其它数据结构
Will
2022-03-28
目录

哈希表

# 概念

哈希表(Hash Table)也称散列表,是根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

也就是说每个记录都以 key-value 的形式存储,通过 key 计算 value 的函数是散列函数,而且 key 是不可重复的。

如为了查找电话本中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名 x 到首字母 F(x)的一个函数关系),在首字母为 W 的表中查找“王”姓的电话号码,显然比直接查找就要快得多。这里使用人名作为关键字,“取首字母”是这个例子中的散列函数,存放首字母的表就是散列表。

# 特点

顺序表的特点是容易查找,但是不适合插入和删除;而链表的特点是插入和删除容易,但是不适合查找。散列表就是顺序表和链表之间做了折中,适合查找,也降低了插入和删除的时间复杂度。

# 散列函数

散列函数没有具体的算法,大都是根据具体业务场景自行设计的,比如前面提到的取首字母就是一种。但是在设计散列函数的时候需要注意两点:

  1. 散列函数要尽可能简单。
  2. 散列函数计算的结果要分布均匀,避免倾斜。

常用的哈希函数的构造方法有 6 种:

# 直接定址法

直接定址法就是取关键字的某个线性函数作为散列地址,即:f(key) = a * key + b (a 和 b 均为常数)

如图,若需要查找年龄为 25 岁的人口数量,将年龄 25 带入哈希函数中,直接求得其对应的哈希地址为 25,对应的值为 1050。

# 数字分析法

若关键字是位数较多的数字组成,则可以考虑抽取其中多位分布均匀的数字作为散列地址。如身份证号码后四位或后六位。

# 平方取中法

对关键字做平方操作,取中间得几位作为哈希地址。假设关键字是 1234,其平方数为 1522756,再抽取其中间 3 为 227 作为散列地址。

# 折叠法

将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。如关键字是 9876543210,散列表表长为 3 为,将其分为 4 组,987|654|321|0,然后叠加求和 987 + 654+321+0 = 1962,再求最后三位得到散列地址为 962。

# 除留余数法

若已知整个哈希表的最大长度 m,可以取一个不大于 m 的数 p,然后对该关键字 key 做取余运算,即:f(key) = key % p。

除留余数法是用的最多的散列函数,一般会先求 key 的 hashCode,然后对 hashCode 进行取余。

# 随机数法

取关键字的随机函数值作为散列地址,即 f(key) = random(key)。

# 散列冲突

上次更新: 2023/11/01, 03:11:44

← 稀疏数组 冒泡排序→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式