根据 cplusplus.com,[set::find][2]
时间复杂度的大小是对数的,[find function in algorithm library][3]
的大小是线性的。
set::find(item)
find(begin(set),end(set),item)
我想知道这两种find
方法在时间复杂度方面的表现有何不同。
>std::find
只是一个线性搜索,因为它在迭代器上没有任何假设。
std::set::find
利用 set 的树结构来实现日志快速性能。
它们的表现与您所说的完全不同(对数与线性(。原因是std::find
只能访问容器的迭代器,并且只使用它们可能的操作(即增加、减少、取消引用......set::find
之所以能如此之快,是因为内部实现的树结构set
.该std::find
上的结构无法访问,因此它不可能那么快。
实际上,我认为"线性大小"也适用于迭代器的比较和步进次数。如果这些操作是昂贵的(在增加迭代器通常是恒定时间时进行比较并不罕见,但我认为对于设置迭代器来说,实际上只是摊销常数,并且在最坏的情况下达到对数(,那么时间复杂度也会受到影响。set::find
也有同样的问题,但程度较小,因为它已经进行了较少的比较。
可以将有关映射的必要信息提供给迭代器,并针对这些类型的迭代器调整std::find
算法。但这绝不是微不足道的,也根本不值得付出努力。但为了更容易适应,这确实已经完成了。例如,对于随机访问迭代器std::binary_search
更快。