【问题标题】:C++ Best Key-Value container sortable by value and fast access to removeC++ 最佳键值容器可按值排序并快速访问以删除
【发布时间】:2018-06-14 03:17:10
【问题描述】:

我目前面临的问题可能是由于我在此类问题上缺乏经验。

我需要一个键值容器,键是唯一的特定值和原始类型(双精度)的值。我的应用程序将为每个候选者构造一个这种类型的容器,并将存储该候选者被识别为特定类型的概率(双精度值)(实际上是枚举的 Key 值)。

然后,我将需要以最高概率对其进行排序,并从每个容器中选择最高的候选者,同时从其他每个容器中删除所选类型。

谢谢。

编辑:关于这个问题的更多解释。

我有一张图像,通过图像分析我发现了几个对象。这些对象将与一个类型匹配,算法返回该对象属于该类型的概率。想象一下,我只有 3 个对象和 3 种类型,我将有 3 个容器,每个对象一个:

对象 A

类型 1 - 95%

类型 2 - 87%

类型 3 - 15%

对象 B

类型 2 - 85%

类型 1 - 23%

类型 3 - 5%

对象 C

类型 3 - 91%

类型 1 - 10%

类型 2 - 1%

如您所见,我会以 3 个容器结束,现在我会看看谁更适合这些类型。由于每个容器的最高概率为 95%(对于对象 A),我现在将说对象 A 属于类型 1。我将继续从其他容器中删除该键的所有条目。现在我会:

对象 B

类型 2 - 85%

类型 3 - 5%

对象 C

类型 3 - 91%

类型 2 - 1%

该操作将被重复。最高概率是对象 C 上的类型 3,有 91%,所以我现在对象 C 属于类型 1。我现在将删除剩余容器中所有类型 1 的候选对象,并以:

对象 B

类型 2 - 85%

对象 B 现在将以类型 2 结束。

【问题讨论】:

  • ::std::map 怎么样?如果键的范围是有限的,你可以只用键作为偏移量的数组。
  • C++ 标准库有containers
  • @VTT 除了它是按键而不是数据排序的(这似乎是 OP 想要的)。
  • 我无法按值排序。但是,我可以将其转换为另一种类型,但是从其他候选列表中删除所选类型的时间效率很低。
  • 可能是std::vector<std::pair<your_key_type, double>>,然后使用std::sortlambda 进行适当比较?

标签: c++ containers


【解决方案1】:

您可以使用完全不同的数据存储和算法。这是一些伪代码:

let data = vector<(object ID, type, probability)>;
run image analysis and fill data;
sort data on probability descending;
let seen_types = set<type>;
let seen_objects = set<object ID>;
for each tuple (oid, type, probability) in data {
  if (seen_types contains type or seen_objects contains oid) continue;
  assign type to oid;
  insert oid into seen_objects;
  insert type into seen_types;
}

删除操作是浪费时间。无论哪种方式,您都需要访问每条数据一次,并且重新排列您的数据以删除您不再看到的内容,这比您在进行过程中忽略它要复杂得多。对两个集合使用哈希集或可能的位集(取决于您的对象 ID 和类型的形状),这给您 O(1) 插入和查找,并且您的算法在数据数量上是 O(NlogN)项目(即对象类型),当您需要对排序概率采取行动时,这是您可以达到的最小值。

【讨论】:

  • 我目前正在使用类似的方法,但您的可能更好。谢谢。
【解决方案2】:

首先,将所有内容存储在地图中。 map&lt;int,int&gt; order; 然后你必须遍历你的数据,假设它是一个地图向量。 因此,您检查所有地图对象中特定类型的最大值。

你需要遍历这个向量(从 A 到 C),然后你需要一个 double/int max = 0;

for(int i = 0; i<vec[0].size(); i++)
    for(int j = 0; i<static_cast<int>(vec.size()); i++){
        max = max(max,vec[j][i]);
    }
order[i] = max;
max = 0; 

我没有检查所有内容,但希望您有所了解。

【讨论】:

  • 我确实有一个想法,但是由于我需要实时执行此操作并且可能有多个对象,因此我更喜欢更高效的方法。
  • @RicardoAlves 不幸的是,像你这样的一些事情只能在 O(n^2) 中完成。您最好改变收集数据的方式。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 2021-09-28
  • 2019-10-16
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多