繁体   English   中英

STL的发现背后有什么算法?

[英]What algorithm is behind STL's find?

我刚刚为地图中的字符串创建了自定义查找功能。 我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度。 所以我搜索了一个更快的函数,找到了map自己的函数: map :: find

这比我使用的线性算法快得多。

在另一个例子中,STL的函数find比我正在使用的另一个线性函数快得多。

但这怎么可能呢? 如果您使用二进制搜索算法,则需要首先对地图进行排序,这会使(地图)更长的时间对地图进行排序。

另外如何找出这些核心功能背后的算法? 是否有列表或某种数据库可以找到它?

谢谢你的所有答案! 我提出了最佳答案并接受了Max Lybbert的答案,因为它是最详细的答案。

保罗:)

std::map以排序顺序存储其元素(几乎总是在自平衡二叉搜索树中)。

std::map::find利用了这一点并使用了二分法搜索

我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度。 所以我搜索了一个更快的函数,找到了map自己的函数: map::find.

这比我使用的线性算法快得多。

std::map旨在使数据在插入容器时保持排序。 这是它的主要工作之一。 这也是你必须为放入std::map的数据定义某种部分排序的原因。

这意味着每次插入比插入其他容器要长一些(插入到std::list - 一旦你有插入点 - 例如是O(1),就像附加到std::vector或附加一样/前置于std::deque )。 但是查找保证使用二进制搜索(或者更确切地说, 导航std::map后面的红黑树 (在“过早或谨慎优化”下))。

在另一个例子中,STL的函数find比我正在使用的另一个线性函数快得多。

但这怎么可能呢? 如果您使用二进制搜索算法,则需要首先对地图进行排序,这会使(地图)更长的时间对地图进行排序。

关于它没有任何假设。 对数据进行排序需要花费时间,并且总是需要更多时间来处理更多数据项。

std::find能够处理未排序的数据,因此必须将其实现为线性搜索(比较std::binary_search / std::lower_bound )。 但是std::find被允许偷偷摸摸地展开循环,一次比较多个项目(如果项目很小,特别是如果它们是原始类型,适合低级别的小提琴),等等。

另外如何找出这些核心功能背后的算法? 是否有列表或某种数据库可以找到它?

就个人而言,我通过阅读STL和其他一些语言中提供的内容学到了很多算法。 我发现首先研究容器更容易。

从技术上讲,没有这样的算法。 该标准定义了每个算法的执行情况,而不是它应该如何执行。 每个编译器都附带标准库的实现。

也就是说,有STL的免费实现。 你可以看看他们的代码。 例如, STL Port

另外如何找出这些核心功能背后的算法? 是否有列表或某种数据库可以找到它?

嗯,有算法和数据结构词典,但它有点乱。

实施很好,依赖于实现。

但就通用复杂性类而言,您可以查看此页面,其中包含常见STL方法的概述:

http://www.cplusplus.com/reference/stl/

STL算法几乎总是比你自己编写的任何算法都要快,因为它可以进行大量的优化。 迭代通过向量或其他随机访问容器时,使用迭代器比使用运算符[]更快,因为开销更少。

你应该查看Scott Meyers的书籍Effective C ++ Third Edition和Effective STL。 (更有效的C ++中的材料包含在Effective C ++的第3版中。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM