查找具有唯一标签

时间:2016-05-26 11:36:07

标签: c++ algorithm queue

我有一个自定义结构数据:

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();
}

是否有更有效的方法来改进我的算法或新想法来解决问题?算法应尽可能快,而且我没有足够的空间来保存循环中的所有项目。

1 个答案:

答案 0 :(得分:2)

我认为你需要维护一个哈希映射,键是标签,值是你的最大堆中结构的位置(或指针)。

当生成新的 mydata 时,首先检查哈希映射中是否存在具有相同标签的结构。如果是,则确定是否替换它(在替换之后,如果需要,在堆中向下移动)或根据距离不要,否则确定是否将新的 mydata 插入你的堆中,并且不要忘了同时更新哈希地图。