【发布时间】:2020-10-06 15:55:05
【问题描述】:
相关:priority queue with limited space: looking for a good algorithm
我正在寻找一种算法,它从列表中返回 k 最大元素,但不改变 k 最大元素的顺序,例如对于k=4 和5,9,1,3,7,2,8,4,6,算法应该返回9,7,8,6。
更多背景信息,我的输入数据大约是 200 对 (distance,importance),它们按 distance 排序,我需要选择其中最重要的 32 个。性能在这里至关重要,因为我必须运行这个选择算法几千次。
到目前为止,我有以下两个想法,但似乎都不是最好的。
- 迭代删除最小元素,直到剩下 32 个元素(即进行选择排序)
- 使用快速选择或中位数来搜索第 32 个最大的元素。之后,再次对剩余的 31 个元素进行排序。距离。
我需要在 C++ 中实现这一点,所以如果有人想编写一些代码并且不知道使用哪种语言,C++ 将是一个选择。
【问题讨论】:
-
为什么不使用标准的堆/优先队列解决方案,还要跟踪每个元素来自哪个索引,然后按索引对结果进行排序?
-
如果可能,我想避免第二个排序步骤。
-
值是否有固定范围?如果是,那么它的小计数排序是一个选项。
-
请注意,对剩下的 32 个元素进行排序会比第一步选择这 32 个元素要快
-
@Cherubim,
distances 是介于 1 和 300000 之间的整数(我可能必须使用浮点数来表示距离,但我认为没有必要)。importances 是介于 -1 和 200 之间的浮点数。因此,计数排序不是一个选项(尽管如此,我还不知道排序算法,谢谢你指点我)。
标签: algorithm sorting selection