有一个字符串的映射如何将它与给定的字符串进行比较

时间:2011-05-12 14:21:10

标签: c++ search boost map text-search

我们有字符串对的映射,如name:location(unix,绝对位置a la myfolder/)。我们给出了一些位置la myfolder/mysubfolder/myfile。如何找到最适合给定网址的地图位置?

示例我们有一个类似的地图:

service1:myfolder/
service2:myfolder/mysubfolder/
service3:myfolder/myothersubfolder/
service4:myfolder/mysubfolder/myfile

我们获得值myfolder/mysubfolder/myfile/blablabla/(字符串)。 我们想知道我们的地图中哪个项目最相关。 搜索结果应为service4,作为最相关内容的地图项。

那么如何通过给定的字符串值找到它最相关的地图元素呢?

请提供一些代码,因为我是C ++ nube并且没有得到如何补充这样的东西?

所以我简化了一个问题 - now all relation I need is in how deep given path is在字符串的情况下,只需通过所有地图路径上的iteratin查看长度,在给定路径中搜索外观并记住找到的大多数长地图项目路径。给定的路径。

3 个答案:

答案 0 :(得分:2)

有两种选择:

  1. 如果您需要运行许多查询:
    1. 构建逆映射或使用双向映射。
    2. 使用upper_bound和。找到第一个更大的元素
      • 如果您需要具有最长公共前缀的元素,请检查此元素和上一个(最后一个较小的)元素,并选择具有较长公共前缀的元素。
      • 如果您需要作为前缀的元素,请向后扫描,直到找到作为前缀的元素。
  2. 如果只需要一个查询,简单的线性搜索会更快(构建逆映射需要 O(n log(n)),而一次迭代只需 O(n) ),加上它更容易实现。只需迭代地图,为每个值计算前缀长度并记住目前为止的最佳匹配(我想建议使用std::max_element,但它通过比较运算符实现最大值,而您需要通过指标获得最大值。)

答案 1 :(得分:1)

如果您的地图定义如下:

typedef std::map<std::string,std::string> MyMap;
MyMap my_map;

...搜索词的定义如下:

std::string my_key_to_find = "service4";

...然后你就可以得到与这个键相关的值:

std::string found_val;
MyMap::const_iterator it = my_map.find(my_key_to_find);
if( it != my_map.end() )
  found_val = it->second;
else
  std::cout << "Key not found!\n";

答案 2 :(得分:1)

如果我正确理解您的问题,您希望按值(字符串)搜索键,其中匹配值是所提供搜索词的子字符串。我不认为有一个简单的解决方案作为一般问题(即任意字符串及其所有子串)。

但是,在示例中用作值的字符串具有特定结构(即文件系统路径)。您可以利用此结构来提出一个干净的解决方案。首先,制作一个bi-directional map。然后,实现以下查找过程:

  1. 如果路径为空,则失败。
  2. 根据请求路径在地图中反向查找
  3. 如果找到,请返回相关值。
  4. 弹出路径上的最后一个组件。
  5. 循环。
  6. 如果列表很短,您可能只想循环遍历(键,值)对列表,并选择值最相似的键(即共同的最长子串)。