簡體   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