【问题标题】:constant time lookup for a inserted number插入数字的恒定时间查找
【发布时间】:2015-01-06 21:37:50
【问题描述】:

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

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

我可以简单地使用一个布尔数组,比如

bool numberExists[1000000000];

但将其初始化为 false 将花费大量时间。 据说我想要恒定的时间插入和查找。

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

【问题讨论】:

  • 你为什么不用std::vector
  • @Shan 我相信向量只支持恒定时间插入而不是查找....
  • @PRP 它是按索引进行的恒定时间查找。由于您的键将是索引,因此这是恒定时间查找。虽然内存相当大。
  • 谁说我的钥匙就是我的索引......?
  • 嗯,你做到了?插入数字 999:vals[999] = true;。检查您是否插入了号码 999:if(vals[999]) ...。但同样,从记忆的角度来看,对于您的大数字来说可能并不理想。

标签: c++ algorithm data-structures


【解决方案1】:

但是 unordered_map 需要两个参数。我只想插入一个数字而不是键值对。

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

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

【讨论】:

  • @PRP 这称为amortized constant time - 与unordered_map 相同。
  • 多个元素插入:平均情况:插入的元素数量呈线性关系。最坏情况:N*(size+1):插入的元素数乘以容器大小加一
  • @PRP 假设在O(1) 中插入哈希表是可行的(除非哈希函数不好)。
  • @Jarod42 谢谢你的评论 - 我编辑提到std::bitset<N>
【解决方案2】:

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

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

【解决方案3】:

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

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

【讨论】:

  • 如果你认为它是重复的,你应该在问题下发表评论,而不是回答它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多