使用O(1)运行时从向量中删除元素

时间:2015-02-06 22:50:57

标签: c++ c++11 vector

"编写一个函数,它将矢量类型的对象作为输入 在常数时间中移除等级k处的元素,O(1)[常数]。假设元素的顺序无关紧要。"

我以为我可能对此有所了解。但是,当我开始尝试使用.erase()时,我查找了大O符号,并发现它是O(n),就像线性关系一样。我现在无法想到任何其他方式。我不想要任何代码,但我认为如果有人可以提供帮助,伪代码至少会指向正确的方向

3 个答案:

答案 0 :(得分:17)

  

假设元素的顺序无关紧要。

这是你需要注意的。

假设你有一个向量

0 1 2 3 4 5 6

并且您要删除3.您可以将其转换为

0 1 2 6 4 5
在O(1)中

没有任何问题。

答案 1 :(得分:12)

实际上,有一种方法可以做到这一点。这是伪代码:

  1. 如果您要删除的元素是向量中的最后一个元素,请将其删除,完成。
  2. 读取向量的最后一个元素,并将其写在要删除的元素上。
  3. 删除矢量的最后一个元素。

答案 2 :(得分:1)

您可以在固定时间内swappop_back

std::swap(vec.back(), vec[rank]);
vec.pop_back();