在sort std :: list中搜索的复杂性是多少?

时间:2014-10-02 22:38:17

标签: c++ search std

sort std :: list中搜索的复杂性是多少?我知道如果数据结构具有随机访问权限,则排序数据中的搜索复杂度为O(log n)。但由于列表没有随机访问权限,因此在排序时它的复杂性是什么?

2 个答案:

答案 0 :(得分:3)

嗯,这是O(N)。搜索始终为std::list中的O(N),已排序或未排序。

排序集合有帮助,因为您可以知道您是否太远或不够。但是,由于你无法在列表的一端开始,但它无济于事。

答案 1 :(得分:1)

这取决于你如何搜索。给定std::list<T> x和值v不在列表中,

  • std::find(x.begin(), x.end(), value)是线性搜索,因此需要进行x.size()比较和迭代步骤,

  • std::binary_search(x.begin(), x.end())使用O(log(x.size()))比较执行二进制搜索,但它仍然必须线性增加迭代器以解决每个比较的目标(同样适用于{{ 1}}等。如果列表未按排序顺序,则此调用的行为未定义。

通常,迭代器递增对于基于节点的容器具有非常重要的成本,因为它涉及指针追踪并且在内存中是非本地的。但是,您需要考虑值类型的比较操作的成本(可能很高,例如对于非常长,几乎相等的字符串)。此外,您可以通过从专用领域分配节点来解决内存局部性问题。