|
NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
|
基于哈希表的无序容器实现 更多...
类 | |
| struct | hashtable_node< T > |
| 哈希表节点 更多... | |
| class | hashtable< Value, Key, HashFcn, ExtractKey, EqualKey, Alloc > |
| 哈希表容器 更多... | |
| struct | hashtable_iterator< IsConst, HashTable > |
| 哈希表迭代器 更多... | |
变量 | |
| NEFORCE_BEGIN_CONSTANTS__ constexpr size_t | HASH_PRIME_LIST [] |
| 哈希表素数列表(64位系统) | |
| constexpr size_t | HASH_PRIMER_COUNT = extent_v<decltype(HASH_PRIME_LIST)> |
| 素数列表长度 | |
基于哈希表的无序容器实现
哈希表是一种基于键直接访问数据的数据结构,通过哈希函数将键映射到桶, 提供平均常数时间复杂度的插入、删除和查找操作。 作为无序关联式容器的底层实现。
本实现严格遵循以下数据结构相关标准规范:
哈希表算法与数据结构文献:
哈希函数设计参考:
负载因子与性能分析:
哈希表通过哈希函数将键映射到数组索引(桶),实现 O(1) 平均时间复杂度的操作:
**核心概念**:
| 概念 | 说明 |
|---|---|
| 哈希函数 | 将键映射到整数索引的函数 |
| 桶 | 存储具有相同哈希值元素的容器 |
| 负载因子 | 元素数量 / 桶数量,决定哈希表的拥挤程度 |
| 冲突 | 不同键产生相同哈希值的现象 |
| 冲突解决 | 链地址法(本实现)或开放寻址法 |
**链地址法**:
本实现使用素数表确定桶数量,以改善哈希分布的均匀性:
| 位数 | 最大素数 | 素数个数 |
|---|---|---|
| 32位 | 1,610,612,741 | 28 |
| 64位 | 6,477,510,814,054,053,699 | 78 |
素数表的选择基于以下原因:
负载因子 α = size / buckets,控制哈希表的时空权衡:
| α 范围 | 性能特征 | 操作 |
|---|---|---|
| α < 0.5 | 稀疏,空间浪费,冲突极少 | 适合高频率查找 |
| 0.5 ≤ α ≤ 1.0 | 平衡,推荐默认值(本实现默认 1.0) | 一般场景最优 |
| α > 1.0 | 密集,空间效率高,查找性能下降 | 触发 rehash |
| α > 2.0 | 过度拥挤,查找退化为 O(n) | 强制 rehash |
当负载因子超过 max_load_factor() 时,自动触发 rehash 扩容。
| 操作 | 平均情况 | 最坏情况 | 说明 |
|---|---|---|---|
| insert | O(1) | O(n) | 冲突时遍历链表,rehash 时 O(n) |
| erase | O(1) | O(n) | 定位桶后删除节点 |
| find | O(1) | O(n) | 遍历桶内链表 |
| count | O(1) | O(n) | 同 find |
| rehash | O(n) | O(n) | 重新分配所有元素 |
| clear | O(n) | O(n) | 释放所有节点 |
其中 n = size()。
| 特性 | 规范参数 |
|---|---|
| 冲突解决 | 链地址法(Separate Chaining) |
| 桶大小增长策略 | 素数表(约 1.5 倍增长) |
| 最大负载因子 | 1.0(默认,可配置) |
| 迭代器类别 | 前向迭代器(Forward Iterator) |
| 异常安全 | 基本保证(insert 时分配失败不影响原有状态) |
| 线程安全 | 不安全(需外部同步) |
| 节点分配 | 使用 Alloc 分配器 |
| 操作 | 失效范围 |
|---|---|
| insert | 不失效任何迭代器 |
| erase | 仅失效指向被删除元素的迭代器 |
| rehash | 全部迭代器失效 |
| clear | 全部迭代器失效 |
| swap | 迭代器交换,指向元素保持有效 |
本实现提供两种插入模式:
| 模式 | 方法后缀 | 行为 |
|---|---|---|
| 唯一键 | _unique | 键已存在时替换或忽略(取决于实现) |
| 允许重复键 | _equal | 允许相同键的多个值共存 |
|
inlineconstexpr |