【数据结构】Hash

Hash

散列表

基础

用于快速查找,和红黑树对比:

  1. 红黑树有序,靠二分查找减少搜索次数,时间复杂度为O(N)
  2. 散列表无序,靠key和value直接映射,时间复杂度为O(N)

组成

  1. hash函数,用于求出key值,要求快速计算、强随机分布(防止冲突)
  2. 数组,用于存储value值,其索引与key相对应。
  3. key值,用于索引到数组中的key,通过hash % 数组size算的。

冲突

冲突衡量指标,负载因子,等于实际数据量/数组容量。

  • 合理的负载因子(<1):冲突时采用单链表来链接相同的key值,如果单链表太长(比如大于200个节点),则可以转换为红黑树或堆结构;也可以采用开放寻址法,比如key重复的时候key+1,key+2,...一直找到空位为止。
  • 不合理的负载因子:如果大于1,则扩容,一般扩大两倍,重新计算hash和key值;如果小于0.1,则缩容,并重新计算hash和key。

布隆过滤器

基础

用于快速确定是否存在某个数据,本身不存储数据,节省内存空间。

组成

  1. 位图,C++中可用byte bits[N];实现,其索引用于查找key
  2. k个哈希函数
  3. key值,通过k个哈希函数 % 位图size得到k个key,并在位图里面k个位置置1

使用方式

  • 如果k个key中任一个key不存在,则必然没有这个数据;如果所有key都存在,则不一定有这个数据(因为存储多个数据,可能key值都被写入了)。
  • 通过预估数据规模n和假阳性p,可以算的位图大小m和需要的hash个数k。

分布式一致哈希

基础

主要是为了解决分布式节点的扩容问题

组成

  1. hash函数
  2. 有顺序的映射容器container,比如C++的map,结构是key1:value1
  3. key1值,用hash函数 % 2^32算得(IP:PORT:SEQ作为参数),固定哈希计算,用于解决缓存失效的问题,因为一旦新增节点,size大小改变,就要重新计算key1值的话,节点的缓存就乱了。
  4. value1值,IP:PORT:SEQ,也即服务器IP地址、端口、序号。
  5. key2值,用hash函数 % 2^32算得(用要缓存的数据算得),在容器container中寻找第一个大于等于此key2的key1值。

使用方法

  1. 要存储的数据通过hash函数 % 2^32算得key2
  2. 在容器container中寻找第一个大于等于此key2的key1值
  3. 通过key1值直接找到value1,解出节点的ip和端口,将数据存储过去

注意点

  • 为什么hash % 2^32 而不是像一般散列表一样,根据大小进行计算?(% size)。因为如果扩容, 增加服务器节点,则hash % size 计算的key2值会全部改变,会导致数据缓存位置错乱,也即缓存失效
  • value1值中的SEQ的序号有什么用,用于创建多个同一服务器的虚拟节点,这样在2^32的范围中就会充满了多个节点,数据计算的key2值能更均匀地分布在各个服务器节点中。同时当新增节点时,也会减少数据迁移的数据量。因为如果只有若干真实的服务器节点,可能多个数据都会放到同一个服务器节点中,导致失衡,也即"缓存偏移"。
  • 多个虚拟节点交错分布,当扩容/缩容/宕机导致数据迁移的时候,可以若干个服务器一起协助,而不是只把压力都放在一台服务器上,降低风险,提高效率;
相关推荐
alphaTao4 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid1125 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余14 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI情绪识别开源15 小时前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
罗西的思考16 小时前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha601616 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘17 小时前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天19 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源20 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶20 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法