固定时间查找插入的数字

constant time lookup for a inserted number

我必须插入 K 个数字,范围从 0 到 10^9。稍后我想知道我是否插入了特定号码。这里 K 的范围从 0 到 10^5.

插入和删除都必须在常数时间内。我看过 C++ STL unordered_map。但是 unordered_map 需要两个参数。我只想插入一个数字而不是 key-value pair.

我可以简单地使用像

这样的布尔数组
bool numberExists[1000000000];

但是将其初始化为 false 会花费很多时间。 如前所述,我想要固定时间插入和查找。

我应该使用什么数据结构...?

But unordered_map requires two parameters. I just want to insert a number not a key-value pair.

那么你应该使用 std::unordered_set<int>:它提供恒定时间查找,摊销恒定时间插入和删除。

如果您正在寻找最坏情况下的常数时间插入和查找,则需要 std::vector<bool> or even std::bitset<N>。但是请注意,迭代所有元素所需的时间是 O(MAX),而不是 O(N),这可能会更糟。

您需要 hashset 并且在 c++ 中它被实现为:unordered_set。 (manual)

请注意,如果您继续添加元素,则不能保证每次添加都是不变的,因为如果达到阈值,则会对所有元素进行重新散列。然而,为了简单起见,它非常接近该目标。

您可以使用内存而不必对其进行零初始化。

这个问题本质上是Data structure that supports the following in O(1) time: initialization, insertion, deletion, finding an element, deleting all elements

的一个骗局