【发布时间】:2025-12-03 22:30:01
【问题描述】:
我有以下结构:MyObject 列表列表, 和比较 2 MyObjects 的比较器
任务是从列表中获取最多 N 个较小的对象。
这个问题可以通过几种方式解决:
将所有元素放在一个新列表中并使用 Collections.sort() 或 Arrays.parallelSort()
将所有元素放入ProirityQueue,然后取出N个top元素
将所有元素放入 SortedSet (TreeSet) 并检索需要的元素 使用迭代器
我不知道如何选择。标准是性能。 “内部”列表的大小约为 20 个元素,“外部”列表的大小约为 10
【问题讨论】:
-
那么,除了写这个问题之外,您到目前为止还做过什么吗?您是否查看过每种可能解决方案的数据结构上的任何操作的时间复杂度?
-
“N 个较小的对象”是什么意思?您需要 N 个比一个特定对象更小的对象,还是需要整个构造中的 N 个最小对象?
-
对于大小列表
20和10,这与性能无关,但如果您的元素不是唯一的,则不能使用SortedSet。 -
即使“标准是性能”,更改列表的频率与访问缩减列表的频率也很重要。怀疑你是否能绕过分析你的选择。
-
如果只需要部分排序,那就只有
N元素。那么最好的可能是PriorityQueue,它正是为此目的而构建的。将所有内容放入其中,然后调用N次pullMin方法(或调用方式)。如果你仔细看看内部是如何实现的,你会立即明白为什么PriorityQueue是这个任务的好选择。但是,正如其他人所说,对于仅包含20元素的列表,情况可能会有所不同。对于像1mio这样更大的列表,您会注意到性能差异很大。
标签: java performance sorting