我刚为地图中的字符串创建了自定义查找功能。我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度。所以我搜索了一个更快的函数并找到了map自己的函数: map :: find 。
这比我使用的线性算法快得多。
在另一个例子中,STL的函数 find 也比我正在使用的另一个线性函数快得多。
但这怎么可能?如果你使用二进制搜索算法,你需要首先对地图进行排序,这将(假设)更多的时间,你的地图越大。
另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?
感谢您的所有答案!我赞成了最佳答案并接受了Max Lybbert的答案,因为它是最详细的答案。
保罗:)答案 0 :(得分:13)
std::map
以排序顺序存储其元素(几乎总是在自平衡二叉搜索树中)。
std::map::find
利用此优势并使用dichotomic search。
答案 1 :(得分:9)
我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度。所以我搜索了一个更快的函数并找到了map自己的函数:
map::find.
这比我使用的线性算法快得多。
std::map
旨在使数据在插入容器时保持排序。这是它的主要工作之一。这也是您必须为放入std::map
的数据定义某种部分排序的原因。
这意味着每次插入比插入其他容器(插入std::list
- 一旦你有插入点 - 需要更长的时间 - 例如是O(1),就像附加到{{ 1}}或附加/前置std::vector
)。但查找保证使用二进制搜索(或者更确切地说,使用navigate the red-black tree behind the std::map
(在“过早或谨慎优化”下)。
在另一个例子中,STL的函数find比我正在使用的另一个线性函数快得多。
但这怎么可能?如果你使用二进制搜索算法,你需要首先对地图进行排序,这将(假设)更多的时间,你的地图越大。
没有任何假设。对数据进行排序需要花费时间,并且总是需要更多时间来处理更多数据项。
std::deque
能够处理未分类的数据,因此必须将其实现为线性搜索(比较std::find
/ std::binary_search
)。但std::lower_bound
允许偷偷摸摸地展开循环,一次比较多个项目(如果项目很小,特别是如果它们是原始类型,适合低级别的小提琴),等等。
另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?
就个人而言,我通过阅读STL和其他一些语言中提供的内容学到了很多算法。我发现首先研究容器更容易。
答案 2 :(得分:3)
从技术上讲,没有这样的算法。该标准定义了每个算法的执行情况,而不是它应该如何执行。每个编译器都附带标准库的实现。
也就是说,有STL的免费实现。你可以看看他们的代码。例如,STL Port。
另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?
答案 3 :(得分:2)
答案 4 :(得分:2)
STL算法几乎总是比你自己编写的任何算法都要快,因为它可以进行大量的优化。迭代通过向量或其他随机访问容器时,使用迭代器比使用运算符[]更快,因为开销更少。
你应该查看Scott Meyers的书籍Effective C ++ Third Edition和Effective STL。 (更有效的C ++中的材料包含在Effective C ++的第3版中。)