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

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

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

最佳答案

我认为您需要维护一个 HashMap ,其中键是标签,值是最大堆中结构的位置(或指针)。

当生成新的mydata时,首先检查 HashMap 中是否存在具有相同标签的结构体。如果是,则判断是否替换它(替换后,根据距离在堆中下移(如果需要的话)或不下移,否则确定是否将新的mydata插入到你的堆中,而不是'不要忘记同时更新您的 HashMap 。

关于c++ - 查找具有唯一标签的前 K 个元素的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459747/

相关文章:

algorithm - Codejam 2015 资格赛 : Infinite House of Pancakes

algorithm - 计算两个列表之间的相似度

c# - 在数组队列上使用 Contains 时,控制台返回 False。为什么?

algorithm - 使用堆栈的 push & pop 操作实现队列

c# - 队列有时会损坏

c++ - 使用页面文件进行缓存?

c++ - 方括号 [] 运算符重载 c++

java - 递归删除相邻的重复字符并返回结果字符串

c++ - boost::spirit 递归命令式 c++ 语法:BOOST_FUSION_ADAPT_STRUCT 失败

c++ - WinRT C++ (Win10) 从 SoftwareBitmap/BitmapBuffer 访问字节