【问题标题】:unordered_multimap<string, string> to map<string, string> soft search, How to do such thing and how to preprocessed maps for faster search?unordered_multimap<string, string> 到 map<string, string> 软搜索,如何做这样的事情以及如何预处理地图以加快搜索速度?
【发布时间】:2011-07-09 13:30:00
【问题描述】:

我们有一个map&lt;boost::shared_ptr&lt;service&gt;, rules&gt; service_map,其中有规则

struct rules
{
boost::unordered_multimap<string, string> set_of_rules_1;
boost::unordered_multimap<string, string> set_of_rules_2;
}

在我的情况下,规则是来自 http 请求 headersarguments 的对,例如,在一个这样的 unordered_multimap 中,我们可以找到 Accept-Language : FRAccept-Language : US

每个boost::shared_ptr&lt;service&gt; 都是从service class 继承的类的某个实例。

我用服务和规则(来自一些共享库和一些带有规则的文本文件)动态填充这个服务地图 规则。

现在我得到了data的实例

struct data
{
map<string, string> headers;
map<string, string> arguments;
}

对于每个给定的data 对象,我需要从service_map 中找到最相关的service 并调用它的service-&gt;inherited_method();

这里的相关是指规则最适合给定数据的规则。例如,如果我们在规则中有Accept-Language : FRAccept-Language : US,那么如果数据包含对Accept-Language : fr-FR,ru;q=0.8,en-US;q=0.6,en;q=0.4,我们认为它是相关的。

预处理我的 service_map 以加快软搜索的最佳方法是什么,以及如何实现这种搜索?

【问题讨论】:

  • 这只是关于 Accept-Language,还是您尝试匹配的其他维度?少谈 C++ 细节,多谈实际概念和预期数据变化会非常有用。

标签: c++ search boost unordered


【解决方案1】:

这是一项艰巨的任务,您必须自己开发一些逻辑。但是,这是一个框架解决方案:

1) 编写一个函数,根据规则与给定数据集的相关性对规则进行排名:

int relevance(const rules & r, const data & d); // write this

2) 对于每条数据,创建一个排序的规则排名。例如,您可以保留一堆迭代器。然后找到匹配最相关规则集的服务。

typedef RuleCollection::const_iterator rit;

boost::shared_ptr<service> find_service(cosnt data & d, ...)
{
  std::multimap<int, rit> relevant_rules;

  for (rit it = rc.begin(), end = rc.end(); it != end; ++it)
  {
    // relevant_rules[relevance(*it, d)] = it; // sorry, that was nonsense
    relevant_rules.insert(std::make_pair(relevance(*it, d), it));
  }

  for (auto it = relevant_rules.rbegin(), rend = relevant_rules.rend(); it != rend; ++it)
  {
    for (auto st = service_map.begin(), end = service_map.end(); st != end; ++st)
    {
      if (*st->second == *it->second) return st->first;
    }
  }
  throw std::exception("Could not find suitable service.");
}

我假设你所有的规则都保存在RuleCollection rc;,一些值类型为rules的容器中。

编辑: 修复了 multimap 元素插入 -- multimap 没有[] 访问运算符,原因很明显。

【讨论】:

    猜你喜欢
    • 2020-08-29
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2013-07-31
    • 2023-02-08
    相关资源
    最近更新 更多