访问集合和向量中的元素与例如:
之间的时间差异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
答案 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和手机上它是如何相同的?)