我必须插入K个数字,范围从0到10 ^ 9。后来我想知道我是否插入了一个特定的号码。这里K的范围是0到10 ^ 5.
插入和删除都必须处于恒定时间。我查看了C ++ STL unordered_map
。但unordered_map
需要两个参数。我只想插入一个不是key-value pair
的数字。
我可以简单地使用像
这样的bool数组bool numberExists[1000000000];
但是将其初始化为假将花费大量时间。 按照说我希望不断插入和查找时间。
我应该使用哪种数据结构......?
答案 0 :(得分:4)
但unordered_map需要两个参数。我只想插入一个不是键值对的数字。
然后你应该使用std::unordered_set<int>
:它提供恒定时间查找,摊销常量时间插入和删除。
如果您正在寻找最坏情况的常量时间插入和查找,则需要std::vector<bool>
甚至std::bitset<N>
。但请注意,迭代其所有元素所花费的时间是O(MAX),而不是O(N),这可能会更糟糕。
答案 1 :(得分:0)
您需要 hashset ,在c ++中,它实现为:unordered_set。 (manual)
请注意,如果继续添加元素,则每个add都不保证是常量,因为如果达到阈值,则完成所有元素的重新散列。但是为了简单起见,它非常接近这个目标。
答案 2 :(得分:0)