用于查找具有值范围的k个最大元素的高效算法

时间:2015-03-04 00:07:32

标签: algorithm range

假设有一个元素列表,每个元素都有一个范围,这样元素的值就在范围内。元素之间的范围可以重叠。确切的值是未知的,但可以计算。选择具有最高k值的元素的最佳算法是什么,以便精确计算的数量最小?

我有一个非常天真和直接的算法,但绝对不是最佳的。

  1. 根据最大范围值对范围进行排序。
  2. 计算前k个值。
  3. 删除最大范围值小于k ^ {th}最高值的元素,直到现在。
  4. 从剩余元素中,计算具有最大范围值的元素的值并更新最高k列表。如果没有剩余元素,则停止。
  5. 转到3

1 个答案:

答案 0 :(得分:0)

这可以在不离开naivité的情况下得到改善:

  • 确保元素A,其中范围-max小于元素B的范围-min也具有较低的实际值。所以你丢弃所有元素,其范围-max低于第5个最高范围-min。这给你留下了一个小得多的列表:如果你的原始列表很长(即:基于磁盘),你最有可能将它减少到基于mem的版本。除此之外,选择运行很可能会让您已经对此子列表进行了排序。
  • 如果仍然需要,请对较小的列表进行排序
  • (*)现在循环类似于原始算法:
    • 从列表中删除最高最大元素并计算它的实际值,将其排序到已排序的工作列表中
    • 将范围 - 最大值低于此值的所有值从当前列表移动到辅助列表,保持排序
  • 这为您提供了更短的工作清单,确保包含最高值
    • 如果有足够的条目,请选择k最高并完成
    • 如果不是这样,请将辅助列表设为新的主列表并转到(*)