C#中如何访问HashSet<T>的内部数组?或支持O(1)增删取随机元素的更优数据结构
核心功能需求
- 目标数据结构需满足两类操作的O(1)时间复杂度要求:
- 元素的插入、删除操作
- 均匀随机获取集合中任意一个元素的操作
方案选型的初始思路与卡点
最初计划选用C#内置的HashSet<T>:它本身的插入、删除操作就是标准常量时间复杂度,只要能直接访问其内部存储元素的数组,只需要生成[0, 存储长度)区间的随机整数作为索引,就能实现O(1)取随机元素的效果。
但该思路存在无法绕开的问题:
- 没有公开途径可以直接访问
HashSet<T>的内部存储数组 - 如果每次取随机元素时都调用
ToArray()生成新数组,会产生O(n)的额外时间开销,完全不符合复杂度要求
对比参考与现存顾虑
对照C#内置Dictionary<TKey, TValue>的实现逻辑,其键集合、值集合的存储是依托内部连续数组的,如果HashSet<T>能提供类似的内部访问能力,就完全匹配需求。
如果临时用Dictionary<TKey, object>模拟实现需求,会存在明显的冗余:
- 完全用不到字典的键值映射核心能力,功能利用率极低
- 同等数据规模下,内存占用约是
HashSet<T>的两倍,存在不必要的空间浪费
待明确的问题
- C#中是否存在合法途径可以直接访问
HashSet<T>的内部存储数组? - 是否存在更适配上述需求、同时没有额外空间浪费的现成数据结构实现?
内容的提问来源于stack exchange,提问作者niodev
相关产品推荐
相关产品推荐

