C++ 浅谈Robin Hood Hash 算法

介绍

“Robin Hood” 在传说中是个 劫富济贫 的英雄,这个策略就像 Robin Hood 一样:

  • 探测距离远的元素 = 穷人
  • 探测距离短的元素 = 富人
  • 插入时发现某位置被占:
    • 如果新元素比桶里元素 更穷(探测距离更远),就 抢占 位置,把老元素 往后挤。

这个策略使得:

  • 贫富差距变小(探测距离差距减小)
  • 查找操作平均探测次数变少
  • 最坏情况比普通线性探测更好

核心概念

名词含义
哈希值(Hash)元素计算出的理想插入位置
探测距离(Probe Distance)当前桶位置与理想桶位置的距离(从 hash%N 开始向后线性探测)
抢占(Stealing)新元素 probe_distance > 当前桶元素的 probe_distance → 抢占位置,并将老元素向后移

和普通线性探测相比的优势

1、减小尾部探测长度
  • 普通线性探测会随着负载因子增加,形成“初级聚集”(primary clustering),导致一些槽位后面链长急剧增长。
  • Robin Hood 则通过“抢劫长探测距离者”的策略,把那些探测距离非常大的元素往前挪,避免“极端长链”形成,从而降低最大探测步数。
2、更均匀的探测分布
  • 普通线性探测下,早期插入且发生冲突的元素会一直停留在簇的前端,后续插入的元素全部堆积在其后,导致簇不断加长。
  • Robin Hood 会让探测距离大的(通常是后插入或哈希分布差异较大的)元素“往前”,探测距离小的“往后”,链长分布更平滑,平均和 95%、99% 百分位查找代价降低。
3、更稳定的查找延迟
  • 在实时或延迟敏感场景下,普通线性探测的最坏情况探测步数会随着负载大幅抖动。
  • Robin Hood 保证大部分操作在一个可控范围内完成,抖动更小。

举例说明

下面用更加直观的 Emoji 阵列,分别展示 普通线性探测(🔵)和 Robin Hood 探测(🟠)在容量为 7(索引 0…6)时,依次插入 10, 17, 24, 3, 0, 5, 7 的全过程。

  • 空槽:▫️
  • 普通线性探测:🔵
  • Robin Hood 探测:🟠
索引:0123456
初始状态(Step 0)
线性: ▫️ ▫️ ▫️ ▫️ ▫️ ▫️ ▫️ RH : ▫️ ▫️ ▫️ ▫️ ▫️ ▫️ ▫️ 
Step 1. 插入 10 (h=3)
线性: ▫️ ▫️ ▫️ 🔵10(0) ▫️ ▫️ ▫️ RH : ▫️ ▫️ ▫️ 🟠10(0) ▫️ ▫️ ▫️ 
Step 2. 插入 17 (h=3)
线性: ▫️ ▫️ ▫️ 🔵10(0) 🔵17(1) ▫️ ▫️ RH : ▫️ ▫️ ▫️ 🟠10(0) 🟠17(1) ▫️ ▫️ 
Step 3:插入 24 (h=3)
线性: ▫️ ▫️ ▫️ 🔵10(0) 🔵17(1) 🔵24(2) ▫️ RH : ▫️ ▫️ ▫️ 🟠10(0) 🟠17(1) 🟠24(2) ▫️ 
Step 4:插入 3 (h=3)
线性: ▫️ ▫️ ▫️ 🔵10(0) 🔵17(1) 🔵24(2) 🔵3(3) RH : ▫️ ▫️ ▫️ 🟠10(0) 🟠17(1) 🟠24(2) 🟠3(3)
Step 5:插入 0 (h=0)
线性: 🔵0(0) ▫️ ▫️ 🔵10(0) 🔵17(1) 🔵24(2) 🔵3(3) RH : 🟠0(0) ▫️ ▫️ 🟠10(0) 🟠17(1) 🟠24(2) 🟠3(3)
Step 6:插入 5 (h=5)
算法过程结果
线性探测5→槽5(24)→槽6(3)→槽0(0)→槽1(▫️) → 放🔵5 → dist=(1−5 mod7)=3🔵0(0) 🔵5(3) ▫️ 🔵10(0) 🔵17(1) 🔵24(2) 🔵3(3)
Robin Hood5→槽5(24,2),0<2→槽6;槽6(3,3),1<3→槽0;槽0(0,0),2>0 → 交换(槽0放🟠5(2),踢出🟠0重插到槽1→dist=1)🟠5(2) 🟠0(1) ▫️ 🟠10(0) 🟠17(1) 🟠24(2) 🟠3(3)
线性: 🔵0(0) 🔵5(3) ▫️ 🔵10(0) 🔵17(1) 🔵24(2) 🔵3(3) RH : 🟠5(2) 🟠0(1) ▫️ 🟠10(0) 🟠17(1) 🟠24(2) 🟠3(3)
Step 7:插入 7 (h=0)
算法过程结果
线性探测7→槽0(0)→槽1(5)→槽2(▫️) → 放🔵7 → dist=(2−0)=2🔵0(0) 🔵5(3) 🔵7(2) 🔵10(0) 🔵17(1) 🔵24(2) 🔵3(3)
Robin Hood7→槽0(5,0)→槽1(0,1)→槽2(▫️) → 放🟠7 → dist=2🟠5(2) 🟠0(1) 🟠7(2) 🟠10(0) 🟠17(1) 🟠24(2) 🟠3(3)
线性: 🔵0(0) 🔵5(3) 🔵7(2) 🔵10(0) 🔵17(1) 🔵24(2) 🔵3(3) RH : 🟠5(2) 🟠0(1) 🟠7(2) 🟠10(0) 🟠17(1) 🟠24(2) 🟠3(3)
Step 8: 查找不存在的值31
  • 线性查找:只要没找到 key,就一直往后找,直到遇到空槽或者 key。
  • Robin Hood 探测:查找元素的探测距离 > 当前槽原有元素的探测距离 → 查找失败!
线性查找:查找31的时候,线性查找的探测距离是7,槽的最大值 Robin Hood 探测:查找到槽0的时候,31的探测距离为4> 槽0中值5的探测距离2, 则停止探测。所以最终探测距离为4

总结

Robin Hood 探测通过“让探测距离大的元素优先占位”的方式,有效抑制了哈希表中因聚集造成的长尾探测链,提升了在高负载场景下的平均与最坏查找性能。

Read more

Kimi K2.5 终极实战手册:开源部署 + API 接入 + Agent 集群 + 多模态视觉

Kimi K2.5 终极实战手册:开源部署 + API 接入 + Agent 集群 + 多模态视觉

一、前置准备(零门槛适配) 1.1 硬件要求(精准匹配) * 入门配置(本地部署,个人使用):CPU≥4核、内存≥16G、GPU(NVIDIA,计算能力≥7.0)显存≥24G(适配Unsloth 1.8-bit量化版),SSD剩余≥100G * 进阶配置(Agent集群/多模态):CPU≥8核、内存≥32G、GPU显存≥32G(3-bit量化版),多卡部署推荐2×3090/4090或1×H20 * 极简配置(仅API接入,无本地部署):任意办公电脑,可正常联网,无需GPU 1.2 软件要求(固定版本,

By Ne0inhk
【花雕动手做】拆解机器人底盘DDSM400钕强磁外转子65mm伺服轮毂电机

【花雕动手做】拆解机器人底盘DDSM400钕强磁外转子65mm伺服轮毂电机

做小型高精度全向机器人底盘,想找一款 “省心又能打” 的动力核心?DDSM400 钕强磁外转子 65mm 伺服轮毂电机 绝对是优选——它把无刷电机、FOC 伺服驱动、高精度编码器集成一体,钕强磁加持、外转子直驱设计,不用额外搭配驱动板,直接装轮就能用,是麦克纳姆轮底盘的 “一体化动力神器”。 但很多创客只知道它好用,却不清楚内部构造:钕强磁转子藏着怎样的动力秘密?伺服驱动和编码器是如何实现精准控制的?外转子直驱为什么能做到零背隙、低噪音? 这里,就完整拆解这款 DDSM400 伺服轮毂电机,从外到内拆解核心部件,解析它的结构优势与工作逻辑,帮你真正看懂这款 “一体化伺服电机”,以后选型、改装、调试机器人底盘,都能心里有底、少走弯路。 DDSM400 伺服轮毂电机・简单拆解步骤 1、拧下轮毂固定螺丝用内六角扳手卸下电机外圈的固定螺丝,分离轮毂外壳与端盖。 2、取出外转子与强磁体轻轻取下外转子总成,内部可见一圈钕铁硼强磁,注意磁力较大,轻拿轻放。 3、

By Ne0inhk

YOLOv改进 | 两个轻量级FCM和MKP模块,FBRT-YOLOv11助力无人机航拍任务VisDrone、UAVDT和AI-TOD

YOLOv改进 | 两个轻量级FCM和MKP模块,FBRT-YOLOv11助力无人机航拍任务VisDrone、UAVDT和AI-TOD 一、引言 在无人机航拍目标检测领域,由于无人机飞行高度变化大、拍摄视角复杂(如俯视、斜视)、目标尺寸差异显著(从微小行人到大型车辆)以及背景干扰多(如云层、建筑物遮挡),传统目标检测模型(如YOLOv11)面临严峻挑战。尤其在VisDrone、UAVDT和AI-TOD等公开数据集中,小目标(如行人、车辆)占比高、特征信息弱,且背景与目标对比度低,导致检测精度和实时性难以兼顾。 为应对这些挑战,本文提出FBRT-YOLOv11改进方案,通过集成两个轻量级模块——FCM(Feature Calibration Module,特征校准模块)和MKP(Multi-scale Key-point Perception,多尺度关键点感知模块),针对性地增强模型对小目标特征的捕捉能力和多尺度上下文信息的利用能力。FBRT-YOLOv11在保持YOLOv11高效单阶段检测优势的同时,显著提升了无人机航拍场景下的检测精度和鲁棒性,尤其适用于VisDrone、UA

By Ne0inhk

AI绘画关键词网站效率提升实战:从数据预处理到模型加速

快速体验 在开始今天关于 AI绘画关键词网站效率提升实战:从数据预处理到模型加速 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 AI绘画关键词网站效率提升实战:从数据预处理到模型加速 最近在开发一个AI绘画关键词推荐网站时,遇到了不少性能瓶颈。用户输入描述词后,系统需要快速返回最相关的绘画风格关键词,但最初的版本响应慢、推荐结果也不够精准。经过一系列优化,最终将查询响应时间降低了60%。下面分享整个优化过程的关键技术和实战经验。 痛点分析:

By Ne0inhk