我有一个自定义结构数据:
struct mydata
{
double distance;
string label;
}
我会在循环中生成大量mydata
。而且我想获得顶级的minium disatnce项目,同时他们的标签必须是独一无二的。
现在我使用max heap来解决这个问题。我的算法是这样的:
// 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()
,因为唯一标签的约束,我不能只用新项替换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();
}
是否有更有效的方法来改进我的算法或新想法来解决问题?算法应尽可能快,而且我没有足够的空间来保存循环中的所有项目。
答案 0 :(得分:2)
我认为你需要维护一个哈希映射,键是标签,值是你的最大堆中结构的位置(或指针)。
当生成新的 mydata 时,首先检查哈希映射中是否存在具有相同标签的结构。如果是,则确定是否替换它(在替换之后,如果需要,在堆中向下移动)或根据距离不要,否则确定是否将新的 mydata 插入你的堆中,并且不要忘了同时更新哈希地图。