[英]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算法幾乎總是比你自己編寫的任何算法都要快,因為它可以進行大量的優化。 迭代通過向量或其他隨機訪問容器時,使用迭代器比使用運算符[]更快,因為開銷更少。
你應該查看Scott Meyers的書籍Effective C ++ Third Edition和Effective STL。 (更有效的C ++中的材料包含在Effective C ++的第3版中。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.