【发布时间】:2016-05-26 11:36:06
【问题描述】:
我有一个自定义结构数据:
struct mydata
{
double distance;
string label;
}
我将在循环中生成大量mydata。而且我想获得最重要的最小差异项目,同时他们的标签必须是唯一的。
现在我正在使用最大堆来解决这个问题。我的算法是这样的:
// get topK items with unique label
for i = 1:N
{
mydata item = generate_a_data();
if (max_heap.size() < K)
{
insert_to_max_heap(item);
}
else // max_heap is full
{
if (item.distance < max_heap(top).distance)
{
insert_to_max_heap(item);
}
}
}
问题发生在insert_to_max_heap(),因为唯一标签的约束,我不能只用新项目替换最大堆中的顶部节点,所以我必须迭代堆中的所有元素以查找是否相同的标签存在。如果存在一个节点具有相同的标签,我只是更新旧节点的距离。伪代码:
insert_to_max_heap(item)
{
for_each node in max_heap
{
if (node.label == item.label)
{
if (node.distance > item.distance)
{
// update min distance
node.distance = item.distance;
}
return;
}
}
// no identical label, replace the top node
max_heap.top = item;
sort_max_heap();
}
有没有更有效的方法来改进我的算法或解决问题的新想法?算法应该尽可能快,而且我没有足够的空间来保存循环中的所有项目。
【问题讨论】:
-
为什么不在 C++ STL 中使用
priority_queue而不是从头开始编写代码? -
看来
priority_queue无法解决我的问题中的唯一标签约束。