set :: find和<algorithm> find之间的性能差异

时间:2019-12-06 11:24:16

标签: c++ stl time-complexity

根据cplusplus.com[set::find][2]的时间复杂度在大小上是对数的,而[find function in algorithm library][3]在大小上是线性的。

    set::find(item)
    find(begin(set),end(set),item)

我想知道这两种find方法在时间复杂度方面的表现如何不同。

2 个答案:

答案 0 :(得分:3)

std::find只是线性搜索,因为它在迭代器上不做任何假设。

std::set::find利用set的树结构来实现对数快速性能。

答案 1 :(得分:2)

它们的表现与您所说的完全不同(对数与线性)。原因是std::find只能访问容器的迭代器,并且只能使用对其可能的操作(即增加,减少,取消引用...)。 set::find之所以如此之快,是由于set内部实现的树形结构。该std::find上的结构无法访问,因此不能那么快。

实际上,我认为“线性大小”也适用于比较次数和迭代器的步进。如果这些操作很昂贵(在增加迭代器的同时进行比较通常并不固定,但是我认为对于set-iterator来说,它实际上只是摊销常数,在最坏的情况下可以达到对数),那么时间复杂度也会受到影响。 set::find有相同的问题,但程度较小,因为它已经进行了较少的比较。

可能将有关映射的必要信息提供给迭代器,并使std::find算法适用于这些类型的迭代器。但这绝不是微不足道的,也不值得付出任何努力。但是,为了更轻松地进行调整,确实可以做到这一点。例如,std::binary_search对于随机访问迭代器来说更快。