查找具有唯一标签的前 K 元素的算法
Algorithm to find top K elements with unique label
我有一个自定义结构数据:
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()
,因为唯一标签的约束,我不能只用新项目替换max堆中的top节点,所以我必须迭代堆中的所有元素来查找是否存在相同的标签。如果存在一个节点具有相同的标签,我只是更新旧节点的距离。伪代码 :
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();
}
有没有更有效的方法来改进我的算法或解决问题的新想法?算法应该尽可能快,我没有足够的空间来保存循环中的所有项目。
我认为您需要维护一个哈希映射,该映射的键是标签,值是最大堆中结构的位置(或指针)。
当生成新的 mydata 时,首先检查哈希图中是否存在具有相同标签的结构。如果为"是",则根据距离决定是否替换它(替换后,如有必要,将其在堆中向下移动),否则确定是否将新的mydata插入堆中,并且不要忘记同时更新您的哈希映射。
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 求最大元素位置的分治算法
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- C++线性搜索算法,确定数组中元素的数量
- 打印所有儿童树元素的最佳算法?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 找到对称矩阵的最大元素的最有效算法是什么
- 使用简单的暴力算法找到数组中最大的4个元素
- C++ 查找算法:如何找到元素的最后一次出现?
- 对数组进行排序的算法,先是第一个元素,然后是前 2 个元素,然后是前 3 个元素,依此类推
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- C++ std::向量插入两个元素替代算法失败
- 编写递归算法以从链表中删除元素.编写递归算法以将元素添加到链表中
- 使用算法中的插入函数将元素插入空容器中,未给出预期的结果
- 算法在容器中查找具有给定值的元素之一的成员
- 并行算法将向量的元素分配到另一个元素的元素
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 删除元素的算法
- 在两个列表中匹配元素算法