在多图中找到一个键的两个最大值

Find two biggest values for one key in a multimap

本文关键字:一个 最大值 两个      更新时间:2023-10-16

i具有一个由键组成的多映像,该密钥是一对ints,键的值是浮点数。现在我想拥有我所有键的两个最大值。
在我的示例中,密钥(1,1(应导致值5.8和3.7。
键(2,2(应导致2.4和1.5。
指出:我不知道密钥的数字和外观。所以我不知道键(2,2(是否存在。

这是代码:

int main(int argc, char** argv)
{
    // Create some values - both vectors have the same size
    // The pairs and the thetas may be unsorted
    vector<pair<int, int>> pairs;
    pairs.push_back(make_pair(1, 1));
    pairs.push_back(make_pair(1, 1));
    pairs.push_back(make_pair(1, 1));
    pairs.push_back(make_pair(2, 2));
    pairs.push_back(make_pair(2, 2));
    pairs.push_back(make_pair(3, 3));
    pairs.push_back(make_pair(3, 3));
    pairs.push_back(make_pair(1, 1));
    vector<float> theta;
    theta.push_back(1.4);
    theta.push_back(2.4);
    theta.push_back(3.7);
    theta.push_back(2.4);
    theta.push_back(1.5);
    theta.push_back(1.6);
    theta.push_back(2.4);
    theta.push_back(5.8);
    multimap<pair<int, int>, float> similarities;
    for (size_t i = 0; i < pairs.size(); i++) {
        similarities.insert(make_pair(make_pair(pairs[i].first, pairs[i].second), theta[i]));
    }
}

在我的具体情况下,我不知道我的多映射中定义了哪个密钥对。我也认为,也许Multimap不是正确的选择,但我不确定是什么更好的类型。
我试图保持theta的矢量格式,但很难跟踪相关对。

我希望我能正确:

auto range = similarities.equal_range(make_pair(1,1));
size_t found = 0; float highest, second_highest;
if (range.first != similarities.end() && range.first != range.second) {
  ++found;
  highest = (*std::max_element(range.first++, range.second)).second;
  if (range.first != range.second) {
    ++found;
    second_highest =
      (*std::max_element(range.first++, range.second, [&](auto a, auto b){ return a.second < b.second && b.second < highest; })).second;
  }
}
if (found > 0)
  std::cout << highest<< std::endl;
if (found > 1)
  std::cout << second_highest << std::endl;

以上不会给您两次相同的值。

您在这里有一些选择。

  • 保留现有的multimap,然后对值进行线性搜索以找到两个最大的。
  • 改用map<pair<int, int>, set<float, std::greater<float> > >,然后在查找钥匙后立即访问前两个项目。
  • 使用map<pair<int, int>, vector<float> >并将矢量对插入进行排序。当进行更多查找时,比插入更好。
  • 在需要检索最高两个值时,请使用map<pair<int, int>, vector<float> >partial_sort。在做更多的插入件时,比查找更多。