Python | 六、哈希表 Hash Table(列表、集合、映射)

哈希表基础

  • 哈希表是一类数据结构(哈希表包含数组、集合和映射,和前两篇文章叙述的字符串、链表平级)
  • 哈希表概念:类似于Python里的字典类型,哈希表把关键码key值通过哈希函数来和哈希表上的索引对应起来,之后输入key值可直接定位到对应索引位置,然后进行取值
  • 哈希表的好处:主要为查找方便,可快速判断一个元素是否在集合中
  • 哈希函数 :即关键码key值和存储位置(索引)的对应关系,一个散列函数,比如把小明映射为0,小李映射为1,如图
  • 哈希碰撞
    • 定义:当哈希函数的映射关系把多个关键码映射到了同一个哈希表索引上时,这种现象称为哈希碰撞,如图所示(哈希碰撞有时候是因为关键码的数量大于哈希表的长度,这时不可避免发生碰撞;但是也可能是哈希函数的对应关系不合理,使得即便仍有空索引,还是把部分关键码分配到了同一索引上)
    • 其实发生哈希碰撞不见得是个坏事,如果是因为关键码的数量大于哈希表的长度,说明此时哈希表的所有索引都被完全利用,没有发生内存浪费
    • 解决方案一:拉链法
      • 当发生冲突时,在对应索引位置通过链表结构储存多个关键码,如图所示
    • 解决方案二:线性探测法
      • 如果是哈希函数的对应关系不合理,使得即便仍有空索引,还是把部分关键码分配到了同一索引上,此时可以利用线性探测法,从发生冲突的索引位置开始,线性查找找到下一个空索引,然后把多余的关键码分配过去,如图所示

常见的三种哈希表结构

  • 列表
  • set集合
    • 是一种数据结构,常用于元素的查找和去重
    • 特点:元素不重复、乱序、可遍历、可变
    • 创建方式一:my_set = {1, 3, 5}
    • 创建方式二:my_set = set()或列表转集合my_set = set([1, 3, 5])
    • 元素查找:使用关键字in,如if "TOM" in my_set:
    • 元素去重:集合结构会进行自动去重操作
    • 数学操作:
      • 交集,set1 | set2将返回二者的交集
      • 并集,set1 & set2将返回二者的并集
      • 差集,set1 - set2将返回1中有,2中没有的元素
    • 常用方法
      • 添加元素,set.add(data)
      • 删除元素,set.remove(data)set.discard(),当删除集合中不存在的元素时,前者会引起异常,后者不会
      • 集合长度,len(set)
      • 清空集合,set.clear()
  • map映射
相关推荐
SharkWeek.11 分钟前
【力扣Hot 100】普通数组2
数据结构·算法·leetcode
Amd7946 小时前
深入探讨索引的创建与删除:提升数据库查询效率的关键技术
数据结构·sql·数据库管理·索引·性能提升·查询优化·数据检索
乔木剑衣8 小时前
Java集合学习:HashMap的原理
java·学习·哈希算法·集合
OKkankan11 小时前
实现二叉树_堆
c语言·数据结构·c++·算法
指尖下的技术12 小时前
Mysql面试题----为什么B+树比B树更适合实现数据库索引
数据结构·数据库·b树·mysql
Bunury15 小时前
组件封装-List
javascript·数据结构·list
Joeysoda15 小时前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
比特在路上15 小时前
ListOJ14:环形链表II(寻找环的入口点)
数据结构·链表
涅槃寂雨19 小时前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
『往事』&白驹过隙;19 小时前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统