根据cplusplus.com,[set::find][2]
的时间复杂度在大小上是对数的,而[find function in algorithm library][3]
在大小上是线性的。
set::find(item)
find(begin(set),end(set),item)
我想知道这两种find
方法在时间复杂度方面的表现如何不同。
答案 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
对于随机访问迭代器来说更快。