algorithms 分类归档

共 126 篇文章 · 返回首页

哈希表内部:开放寻址、链式、Robin Hood 的三国演义

Go 的 map 用的是什么哈希表?Rust 的 HashMap 呢?Python 的 dict 呢?它们分别选了三条完全不同的路线——链式哈希、Swiss Table、开放寻址。选择背后的 trade-off 远比你想象的深。本文从冲突解决到 SIMD 加速,再到当前环境可复现的 benchmark,用 C 代码和真实数据讲透哈希表的内部实现。

并发跳表:ConcurrentSkipListMap 的设计

Java 的 `java.util.concurrent` 提供了 ConcurrentHashMap,却没有 ConcurrentTreeMap——取而代之的是一个基于跳表的 ConcurrentSkipListMap。为什么 Doug Lea 选择了跳表而不是红黑树?因为平衡树的旋转操作会同时修改多个节点的指针,在并发场景下几乎不可能做到无锁;而跳表天然的分层链表结构使得每次修改只涉及局部指针,为 CAS 操作提供了完美的施展空间。