微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C# 中获取 HashSet<T> 的内部数组

如何解决在 C# 中获取 HashSet<T> 的内部数组

我需要一个具有 O(1) 插入和删除操作的数据结构,我可以从中检索 O(1) 处的随机元素。

我想到了在 C# 中使用 HashSet。插入和删除操作是恒定的,如果我可以访问内部数组,我也可以从中获取随机元素。我不想从集合中创建一个数组,每次都需要 O(n)。

所以我的问题是,有没有办法访问 HashSet 的内部数组?或者有没有更好的数据结构满足要求?

注意:例如 Dictionary 允许访问键和值的内部数组。如果 HashSet 也有这个,那就太棒了。我可以使用字典,但我不会真正将它用于映射功能,因为它需要两倍于 HashSet 的空间。

解决方法

您似乎有一大堆误解,本应在任何数据结构介绍课程中纠正。

我需要一个具有 O(1) 插入和删除操作的数据结构,我可以从中检索 O(1) 处的随机元素。

没有这样的数据结构。

您分配此属性的 Dictionary<> 实现实际上将数据存储两次,一次在哈希表结构中(与 HashSet<> 相同),第二次在数组中以便于迭代,这由于它必须更新关联的数组,因此在技术上进行删除操作为 O(n)。但是,如果您觉得这很有吸引力,那么没有什么可以阻止您将数据存储在您的集合旁边的第二个数组中。

插入和删除操作是不变的

不,它们不是,因为碰撞。插入和删除冲突的数据是一个线性操作,因此哈希表的最坏情况复杂度实际上是O(n)

有没有办法访问 HashSet 的内部数组?

HashSet 中没有这样的数组。

至于你能做什么,你可以迭代一个集合。 HashSet 以“随机但稳定”的顺序返回其内容,而 SortedSet 以用户定义的方式返回其数据排序。如果您的算法不能线性工作,并且不能通过集合查找工作,并且您不想实现一个数组来存储您想要的任何顺序,我建议实现一个更好的算法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。