🌟🌟🌟🌟🌟亲爱的朋友们,热烈欢迎你们来到我的创意编程空间!能与你们在这里相聚,我感到无比激动和荣幸。在这个充满挑战与机遇的时代,我们每个人都在不断追求知识的深度与广度。而我的博客,正是一个激发灵感与分享智慧的乐园。在这里,你们不仅能够发现有趣的编程项目和实用的技术资源,还可以畅所欲言,分享你们的经验与想法。我真诚地期待着你们的到来,愿我们在这片小小的天地里携手前行,共同探索未知的领域。🌟🌟🌟🌟🌟
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目录
引言
在软件开发的世界里,高效的数据结构是提升程序性能的关键。今天,我们要深入探讨一个基于布谷鸟哈希算法(Cuckoo Hashing)实现的集合类 ExistSet
。这个集合类提供了 O(1) 时间复杂度的查询和删除操作,在处理元素查找和删除需求时具有显著的性能优势。
1、布谷鸟哈希算法简介
布谷鸟哈希算法是一种开放寻址的哈希方法,它使用多个哈希函数和多个哈希表来减少哈希冲突。当一个元素插入时,它会被映射到多个位置,如果这些位置都已被占用,就会像布谷鸟把其他鸟的蛋挤出鸟巢一样,将已有的元素挤出来,被挤出的元素再尝试插入到它的其他可选位置。这种置换过程可能会重复多次,直到所有元素都有合适的位置或者达到最大尝试次数。
2、设计亮点
2.1 双哈希表架构:采用table1/table2双存储结构
2.2 布谷鸟哈希算法:通过元素置换实现高效插入
2.3 自动扩容机制:容量翻倍时保持O(1)访问特性
2.4 预存哈希值:牺牲空间换时间,提升查询效率
3、ExistSet
类的主要成员变量
DEFAULT_CAPACITY
:默认初始容量,值为 16,且必须是 2 的幂,这样设计有助于在哈希计算时通过位运算快速定位元素位置。MAX_PROBE
:最大探测次数,当插入元素时,如果经过 8 次尝试仍无法找到合适的位置,就会触发扩容操作。LOAD_FACTOR
:负载因子,值为 0.5f。当集合中的元素数量超过capacity * LOAD_FACTOR
时,会触发扩容,以保证哈希表的性能。table1
和table2
:两个哈希表,用于存储元素条目。size
:当前集合中元素的数量。threshold
:扩容阈值,当size
超过该值时,会调用resize()
方法进行扩容。
// 默认初始容量,必须是2的幂
private static final int DEFAULT_CAPACITY = 16;
// 最大探测次数,超过则触发扩容
private static final int MAX_PROBE = 8;
// 负载因子,当元素数量超过 capacity * LOAD_FACTOR 时扩容
private static final float LOAD_FACTOR = 0.5f;
// 第一个哈希表,存储条目
private Entry<T>[] table1;
// 第二个哈希表,存储条目
priv