我目前面临的一个问题可能是由于我在这类问题上缺乏经验。
我需要一个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的类型结束。
答案 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)项目(对象类型),这是您在需要对排序概率进行操作时可以达到的最小值。