【发布时间】:2011-02-16 23:21:12
【问题描述】:
set<int> s;
s.insert(1);
s.insert(2);
...
s.insert(n);
我想知道s.find(k) 需要多少时间,其中k 是1..n 中的数字?
我假设它是 log(n)。这是正确的吗?
【问题讨论】:
-
你的意思是“log(n)”而不是“n log(n)”吗?
set<int> s;
s.insert(1);
s.insert(2);
...
s.insert(n);
我想知道s.find(k) 需要多少时间,其中k 是1..n 中的数字?
我假设它是 log(n)。这是正确的吗?
【问题讨论】:
O(log N) 来搜索单个元素。
§23.1.2 表 69
expression return note complexity
a.find(k) iterator; returns an iterator pointing to an logarithmic
const_iterator element with the key equivalent to k,
for constant a or a.end() if such an element is not
found
【讨论】:
std::set::find() 与O(log(n)) 的复杂性仅仅意味着将有log(n) 的顺序对存储在set 中的对象进行比较。
如果集合中2个元素的比较复杂度为O(k),那么实际复杂度为O(log(n)∗k)。
这可能发生在例如字符串集的情况下(k 将是最长字符串的长度),因为 2 个字符串的比较可能意味着比较它们的大部分(或全部)字符(如果它们以相同的前缀开头或相等)
documentation 也是这么说的:
复杂度
大小为对数。
【讨论】: