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

时间:2011-11-14 13:44:52

标签: c++ search vector

    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件物品,则需要一段时间)。 请注意,我必须检查所有匹配的项目并将其位置存储在容器中。

Bonus Kudos:​​任何人都知道如何进行搜索,以便找到部分结果(例如:搜索“coolro”并存储变量“coolroomhere”的位置)

3 个答案:

答案 0 :(得分:8)

在对矢量

进行排序后使用binary_search
  1. std :: sort(serverList.begin(),serverList.end())
  2. std :: lower_bound(serverList.begin(),serverList.end(),valuetoFind)找到第一个匹配的
  3. 如果要查找所有匹配元素
  4. ,请使用 std :: equal_range

    lower_bound&amp; equal_range 搜索因为它是二进制是对数而不是你的搜索是O(N)

答案 1 :(得分:5)

基本上,你问是否可以检查a的所有元素 匹配,不检查所有元素。如果有某种外在的 元信息(例如,数据被分类),它可能是可能的(例如, 使用二进制搜索)。否则,就其本质而言,要检查所有 元素,你必须检查所有元素。

如果你要在列表和列表上做很多这样的搜索 如果没有变化,您可以考虑使用商品计算第二张表 条目的哈希码;再次取决于数据的类型 抬起头来,计算哈希码的效率会更高效 索引,并首先比较哈希码,只比较字符串 哈希码是相等的。这是否有所改善 取决于表的大小和其中的数据类型。你可能会 也能够利用关于字符串中数据的知识;如果 它们都是URL,例如,大部分以"http://www."开头, 在第十个角色开始比较,只回到 比较前10个,如果所有其余的都相等,可能最终会变大 取胜。

关于查找子字符串,您可以使用std::search 元素:

for ( std::vector<std::string::const_iterator 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搜索会将搜索字符串预编译为必要的 在进入循环之前的表格。

答案 2 :(得分:2)

如果您将容器设为std::map而不是std::vector,则使用的基础数据结构将优化用于执行此类关键字搜索。

如果您改为使用std::multimap,则成员函数equal_range()将返回一对覆盖地图中每个匹配的迭代器。听起来像你想要的那样。

下面的智能评论者指出,如果您实际上不存储任何信息而不是名称(搜索键),那么您应该使用std::multiset