簡體   English   中英

使用 std::vector 的快速搜索算法<std::string>

[英]Fast search algorithm with std::vector<std::string>

    for (std::vector<const std::string>::const_iterator it = serverList.begin(); it != serverList.end(); it++)
    {
        // found a match, store the location
        if (index == *it) // index is a string
        {
            indexResult.push_back(std::distance(serverList.begin(), it)); // std::vector<unsigned int>
        }
    }

我已經編寫了上面的代碼來查看字符串向量並返回另一個帶有任何“命中”位置的向量。

有沒有辦法做同樣的事情,但更快? (如果我的容器中有 10,000 件物品,則需要一段時間)。 請注意,我必須檢查所有物品是否匹配並將其位置存儲在容器中。

獎勵榮譽:任何人都知道我如何進行搜索以找到部分結果的任何方式/鏈接(例如:搜索“coolro”並存儲變量“coolroomhere”的位置)

對向量排序后使用 binary_search

  1. std::sort( serverList.begin() , serverList.end() )
  2. std::lower_bound(serverList.begin() , serverList.end() , valuetoFind) 找到第一個匹配
  3. 如果要查找所有匹配元素,請使用std::equal_range

O(N) 的搜索相比, lower_bound 和 equal_range搜索是二進制的,因此是對數的

基本上,您是在詢問是否可以檢查所有元素是否匹配,而不檢查所有元素。 如果存在某種外部元信息(例如數據已排序),則可能(例如使用二進制搜索)。 否則,就其本質而言,要檢查所有元素,您必須檢查所有元素。

如果您打算在列表上進行許多此類搜索,並且列表沒有變化,您可以考慮使用條目的良好哈希碼計算第二個表; 再次取決於要查找的數據類型,計算索引的哈希碼並首先比較哈希碼,如果哈希碼相等,則僅比較字符串可能會更有效。 這是否是一種改進在很大程度上取決於表的大小和其中的數據類型。 您還可以利用有關字符串中數據的知識; 例如,如果它們都是 URL,則大多以"http://www."開頭"http://www." ,從第 10 個字符開始比較,如果其余所有字符都相等,則僅返回比較前 10 個字符,最終可能會大獲全勝。

關於查找子字符串,您可以對每個元素使用std::search

for ( auto iter = serverList.begin();
        iter != serverList.end();
        ++ iter ) {
    if ( std::search( iter->begin(), iter->end(),
                      index.begin(), index.end() ) != iter->end() ) {
        indexResult.push_back( iter - serverList.begin() );
    }
}

根據要搜索的元素數量和所涉及字符串的長度,使用 BM 搜索之類的方法可能更有效,但是,在進入循環之前將搜索字符串預編譯為必要的表。

如果您將容器設為std::map而不是std::vector ,則所使用的底層數據結構將是為進行此類關鍵字搜索而優化的數據結構。

如果您改為使用std::multimap ,則成員函數equal_range()將返回一對覆蓋映射中每個匹配項的迭代器。 這聽起來像你想要的。

下面的一位聰明的評論者指出,如果您實際上沒有存儲比名稱(搜索鍵)更多的信息,那么您可能應該改用std::multiset

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM