【问题标题】:Algorithm to find top K elements with unique label查找具有唯一标签的前 K 个元素的算法
【发布时间】: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无法解决我的问题中的唯一标签约束。

标签: c++ algorithm queue


【解决方案1】:

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

当生成新的mydata时,首先检查hash map中是否存在具有相同标签的struct,如果是,判断是否替换(替换后,必要时在堆中下移)或不根据距离,否则确定是否插入新的mydata到你的堆中,不要'不要忘记同时更新您的哈希映射。

【讨论】:

  • 感谢您的建议,我现在使用了哈希映射,但与您的想法有点不同。但是你的回答给了我一个很好的方向:)我的哈希映射键是标签,哈希值是mydata。当我生成一个新的mydata 时,我将检查哈希映射是否存在新标签,如果存在,则以最小距离更新值,如果不存在,则将新项目插入哈希。循环后,我使用最大堆迭代哈希中的所有项目,在我的哈希图中找到前 K 项。时间复杂度为O(nlog(M)+ Mlog(K)),M为标签集的数量,通常小于n,mydata的数量。
猜你喜欢
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 2019-12-06
相关资源
最近更新 更多