在 abseil::node_hash_map 中选择一个随机ish元素?

问题描述

是否可以在 abseil::node_hash_map 或更一般的任何 abseil 映射中有效地选择一个有点随机的元素?

例如,我对随机选择一个插槽的方法感到满意,然后找到下一个占用的插槽并从散列到该插槽的元素中选择一个随机元素,但目前尚不清楚这是可能的无法访问地图内部。

std::next(map,n) 这样的东西,其中 n一个[0,map.size()) 之间随机选择的整数可以工作,但在复杂度 O(map.size()) 时非常慢。

解决方法

不,你不能那样做。

你能得到的最接近的是创建一个单独的指向 node_hash_map 元素的指针数组,然后在这些指针中随机选择。这样,你第一次选择一个元素时,是 O(N) 时间,但之后是 O(1)。