set和vector stl c ++的时间复杂度问题

时间:2015-11-30 22:21:06

标签: vector stl set time-complexity

访问集合和向量中的元素与例如:

之间的时间差异
int val = 5;
set <int> a;
int x = *lower_bound(a.begin(), a.end(), val); // i got time limit exceed 
int y = *a.lower_bound(val); // i got accepted time

2 个答案:

答案 0 :(得分:1)

你在这里打两个不同的电话:

  • 首先,有两个迭代器和一个值
  • 的自由函数std::lower_bound
  • 第二,你正在调用成员函数std::set::lower_bound,它接受​​一个集合(隐式)和一个值。

第一个例程是lower_bound的一般实现,并进行二元搜索。由于std::set::const_iterator不是随机访问,因此需要大量的前向和后向链接跟踪(首先,前进到中间等)。

第二个例程具有底层集的知识(实现为树)。它从根开始,沿树向下走,找到它需要的值。这样效率更高。

答案 1 :(得分:0)

你是在谈论复杂性吗?

对于std::vector,来自documentation

  

随机访问 - 常数O(1)

     

在末尾插入或删除元素 - 摊销常数O(1)

     

插入或移除元素 - 距离矢量O(n)

末端的线性距离

对于std::unordered_set,来自documentation

  

搜索,插入和删除具有平均的恒定时间复杂度。

时间上的差异没有多大意义,因为它取决于很多因素(例如,在i7和手机上它是如何相同的?)