C++ 最佳键值容器,可按值排序并快速访问删除

标签 c++ containers

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

我需要一个 Key-Value 容器,其中的键是一个唯一的特定值和一个基本类型 (double) 的值。我的应用程序会为每个候选项构造一个这种类型的容器,并存储该候选项被识别为特定类型的概率(double 值)(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 结束。

最佳答案

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

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)项目(即对象类型),这是当您需要对排序概率采取行动时可以达到的最低限度。

关于C++ 最佳键值容器,可按值排序并快速访问删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48094475/

相关文章:

c++ - `(void)d`的用途是什么

c++ - 影响正面光照渲染的 Open GL 背面

c++ - 逆向工程 OSX 用户诊断报告堆栈跟踪

containers - 我可以更 retrofit 载在 IBM 容器中的卷上的目录的所有者吗?

c++ - 声明的允许使用上下文

c++ - 在简单的 vector 实现中优化运行时间

python - 为什么魔术方法不会被 python 中的 __getattr__ 实现拦截?

java - Docker 容器中的 JVM 初始 CPU 峰值

windows - 在 Windows docker 容器中使用退出代码 3221225781(缺少库)调试错误

c++ - 如何使用 STL 容器来保存基于模板的 shared_ptr?