C++ 查找具有唯一标签的前K个元素的算法

C++ 查找具有唯一标签的前K个元素的算法,c++,algorithm,queue,C++,Algorithm,Queue,我有一个自定义结构数据: 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

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

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

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

我认为您需要维护一个哈希映射,其中键是label,值是结构在最大堆中的位置(或指针)


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

为什么不在C++ STL中使用“代码>优先级PielyQue2/<代码”而不是从头开始编写代码?似乎<>代码> PrimyIyQueLe>/Cudio>不能解决我的问题中的唯一标签约束。谢谢你的建议,我现在已经使用了哈希地图,但是和你的想法有点不同。但你的回答给了我一个很好的指导:)我的哈希映射的键是label,哈希值是
mydata
。当我生成一个新的
mydata
时,我将检查哈希映射是否存在新标签,如果是,则用最小距离更新值,如果否,则将新项插入哈希。循环之后,我使用最大堆迭代散列中的所有项,在我的散列映射中找到前K个项。时间复杂度为
O(nlog(M)+Mlog(K))
,M是标签集的数量,通常比n小,n是
mydata的数量。
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();
}