31、无锁哈希集与开放寻址哈希集的实现与分析

无锁与布谷鸟哈希集实现、对比及优化

无锁哈希集与开放寻址哈希集的实现与分析

1. 无锁哈希集概述

在哈希集的实现中,为了避免在调整表大小时“停止世界”(stop-the-world)的操作,我们需要将哈希集的实现改为无锁(lock-free)的,并且采用增量式调整大小的方式。这意味着每次调用 add() 方法时,只执行与调整大小相关工作的一小部分。这样, contains() add() remove() 方法的预期时间复杂度都为常数。

要实现可调整大小的无锁哈希,仅使各个桶无锁是不够的,因为调整表大小时需要原子地将条目从旧桶移动到新桶。如果表容量翻倍,我们必须将旧桶中的项拆分到两个新桶中。如果这个移动操作不是原子的,条目可能会暂时丢失或重复。

2. 递归拆分排序算法

2.1 算法核心思想

传统的哈希结构是在桶之间移动项,而这里的算法是在项之间移动桶。具体来说,将所有项保存在一个无锁的单链表中,类似于之前研究过的 LockFreeList 类。桶只是链表中的一个引用。随着链表的增长,我们引入额外的桶引用,以确保任何对象都不会离桶的起始位置太远。

2.2 数据结构组成

无锁哈希集的实现由两部分组成:一个无锁链表和一个不断扩展的引用数组,这些引用指向链表。这些引用就是逻辑桶。哈希集中的任何项都可以从链表头开始遍历链表找到,而桶引用则提供了链表的捷径,以最小化搜索时遍历的链表节点数。

2.3 桶的初始化与项的分配

哈希集的容量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值