【问题标题】:Complexity of std::map::insert_or_assign with hint带有提示的 std::map::insert_or_assign 的复杂性
【发布时间】:2018-05-19 04:09:34
【问题描述】:

std::map::insertstd::map::assign 在地图中已经存在元素的情况下提供提示的时间复杂度是多少? CPP-Reference 说它和emplace_hint 一样,它说:

"如果在提示之前插入新元素,则摊销常数"

但是:

  1. 如果没有插入新元素怎么办?
  2. 提示应该是lower_bound 还是upper_bound

【问题讨论】:

  • 请注意,只有当您免费获得提示时,使用提示才是胜利,例如插入基本排序的数据。如果您首先搜索提示,那就是 O(log n) 本身。
  • 在这个特定的用例中,我已经事先进行了upper_bound 搜索其他原因。但我想知道在元素已经存在的情况下,使用该值作为提示是否会提供时间保证。

标签: c++ c++17 stdmap


【解决方案1】:

如果key已经存在,那就更简单了,不需要在map中添加新节点,只需要赋值,所以再次摊销O(1)。 “就在提示之前”一词表明提示应该略高于映射的键,即upper_bound

【讨论】:

  • 这就是我的猜测,但措辞是这样的,我不是 100% 有信心。
  • 奇怪的是,如果它已经存在,您需要将迭代器提供到现有节点之后的一个位置,而不是现有节点本身。
  • 为什么会这样呢?这是为了与 insertemplace_hint 保持一致,如果元素已经存在,则什么都不做。
  • 好吧,措辞似乎非常具体到“如果插入了新元素”,所以如果没有插入新元素,它显然没有什么可保证的复杂性,这就是我想知道的原因如果我可以依靠它。
  • lower_boundupper_bound 之前插入新元素,两者都应该满足二叉搜索树的要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多