Rust 如何快速地从HashSet中窥视任意值?

Rust 如何快速地从HashSet中窥视任意值?,rust,Rust,目前,当我想从哈希集中获取任何值时,我是这样做的: 我的集合。iter.next.unwrap; 与BTreeSet中的第一个或最后一个方法相比,它需要很长的时间,并且我的程序会因此受到很大的影响。此外,出于性能原因,我不能使用BTreeSet,因为它会大大降低我的程序速度 是否有任何方法可以比我使用的更快地从我的集合中获取任何值?最好的方法是保持哈希表的低负载因子,但代价是哈希冲突的风险更高。 或者,如果您知道哪些条目更有可能具有某些价值, 维护这些条目的小索引。 否则,这是不可能改善的 下面

目前,当我想从哈希集中获取任何值时,我是这样做的:

我的集合。iter.next.unwrap; 与BTreeSet中的第一个或最后一个方法相比,它需要很长的时间,并且我的程序会因此受到很大的影响。此外,出于性能原因,我不能使用BTreeSet,因为它会大大降低我的程序速度


是否有任何方法可以比我使用的更快地从我的集合中获取任何值?

最好的方法是保持哈希表的低负载因子,但代价是哈希冲突的风险更高。 或者,如果您知道哪些条目更有可能具有某些价值, 维护这些条目的小索引。 否则,这是不可能改善的

下面描述了为什么这不可能的直观证明

首先让我们回顾一下HashSet的结构。哈希集基于哈希值键控的哈希表。以下使用取自Wikipedia的此哈希表作为示例:

假设存在从哈希表中获取任意项的有效算法

考虑我们在示例中插入三个条目的情况, 然后打电话给removeJohn Smith和removeLisa Smith。 现在我们运行这个虚拟算法,得到521-9655。这是怎么做到的? 由于假设散列值是均匀分布的, 正在尝试探测条目00,01。。。应该像任何其他算法一样高效地执行 假设没有其他已知信息。 然后我们看到了最坏的情况,在这个例子中,我们需要探测条目,15次探测来找到任意条目。 请注意,这n是哈希表项的数量, 它通过哈希表负载因子与哈希集的大小线性相关 或始终的最大大小,这取决于删除过多项时实现收缩和重建哈希表的方式

因此,为了获得更快的算法,我们必须维护关于哈希表的其他信息 而不仅仅是最初的实现。 考虑索引FN指针的情况,该指针可能有插入项。 如何维护该索引? 我们可能会对insert或remove执行一些操作。 插入条目时更新索引可能很简单, 但如果连续删除fn 最后,假设我们不知道什么更可能被插入/删除 散列密钥是均匀分布的, 窥视任意值的性能必须为 或在一定程度上影响插入/删除的性能


这个结论可能有用。一个简单的建议是,假设remove调用的频率明显低于搜索任意值的频率,则延迟计算结果

可能需要更多关于使用模式的信息来回答此问题。在你开始偷看元素之后,你还要向集合中添加更多的元素吗?你会按值查找任何项目吗?所有内容都是按引用进行的,我并不真正查找值。相反,我大量使用了交叉点等方法。哈希集的本质是它的结构不知道哪些哈希表条目包含值。感谢您的解释!使用shrink_to_fit方法使表更密集有助于显著降低迭代成本!