【问题标题】:having a map of strings how to compare it to given string有一个字符串映射如何将它与给定的字符串进行比较
【发布时间】:2011-08-24 04:19:22
【问题描述】:

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

例如,我们有一张这样的地图:

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 在字符串的情况下,可以通过遍历所有地图路径来查看 thare langth ,搜索给定路径中的外观并记住在给定路径中找到的最长地图项路径.

【问题讨论】:

  • 你标记了你的问题提升 - 双向地图是一种选择吗?
  • 您目前尝试过什么?你有任何代码可以分享吗?
  • 如果双向地图 (Bimap in boost) 是“正确的”,那么您的实际问题是什么? (当然,我看到你已经编辑了这个,并且你不是在寻找一个严格的映射 - 你有一些“最相似”的概念。听起来你需要真正定义你的意思,然后搜索您的键值对映射与目标值的最大“相似性”。)

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


【解决方案1】:

有两种选择:

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

【讨论】:

    【解决方案2】:

    如果你的地图是这样定义的:

    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";
    

    【讨论】:

    • 我认为 Blender 想要搜索部分键
    • 我想他是想搜索value来获取key。
    【解决方案3】:

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

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

    1. 如果路径为空,则失败。
    2. 根据请求路径在地图中反向查找
    3. 如果找到,则返回相关值。
    4. 从路径中弹出最后一个组件。
    5. 循环。

    如果列表很短,您可能只想遍历 (key,value) 对的列表并选择值最相似的键(即最长的公共子字符串)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2019-09-18
      • 2016-08-29
      相关资源
      最近更新 更多