sort std :: list中搜索的复杂性是多少?我知道如果数据结构具有随机访问权限,则排序数据中的搜索复杂度为O(log n)。但由于列表没有随机访问权限,因此在排序时它的复杂性是什么?
答案 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}}等。如果列表未按排序顺序,则此调用的行为未定义。
通常,迭代器递增对于基于节点的容器具有非常重要的成本,因为它涉及指针追踪并且在内存中是非本地的。但是,您需要考虑值类型的比较操作的成本(可能很高,例如对于非常长,几乎相等的字符串)。此外,您可以通过从专用领域分配节点来解决内存局部性问题。