【问题标题】:What is time complexity for find method in a set in c++?c++ 中查找方法的时间复杂度是多少?
【发布时间】: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)”吗?

标签: c++ stl find set


【解决方案1】:

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

【讨论】:

  • 很好的信息,但是 §23.1.2 表 69 没有书名就不太好了。
  • @snibbets:处理标准化语言时,书是标准。答案是 C++03 标准。在当前的 C++11 标准中,这将是 §23.2.4 表 102。
【解决方案2】:

std::set::find()O(log(n)) 的复杂性仅仅意味着将有log(n) 的顺序对存储在set 中的对象进行比较。

如果集合中2个元素的比较复杂度为O(k),那么实际复杂度为O(log(n)∗k)
这可能发生在例如字符串集的情况下(k 将是最长字符串的长度),因为 2 个字符串的比较可能意味着比较它们的大部分(或全部)字符(如果它们以相同的前缀开头或相等)

documentation 也是这么说的:

复杂度

大小为对数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多