C ++ Best Key-Value容器可按值排序并快速访问删除

时间:2018-01-04 11:39:10

标签: c++ containers

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

我需要一个Key-Value容器,其中key是唯一的特定值和基本类型的值(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的类型结束。

2 个答案:

答案 0 :(得分:1)

首先,将所有内容存储在地图中。 map<int,int> 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; 

我没有检查所有内容,但我希望你有个主意。

答案 1 :(得分: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(N logN)项目(对象类型),这是您在需要对排序概率进行操作时可以达到的最小值。