设置::查找和查找之间的性能差异<algorithm>



根据 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更快。

相关内容

最新更新