Java 我能';我不记得固定大小的排序树的数据结构

Java 我能';我不记得固定大小的排序树的数据结构,java,data-structures,computer-science,Java,Data Structures,Computer Science,假设我想从任意数量的记录中找出最低的10个值。当我循环遍历记录时,我将它们添加到结构中,直到它达到我的最大大小10。之后,每次我添加一条不高于列表中最高记录的记录时,当前最高记录将被删除,保留最大记录数 或者更简单地说,我如何处理一个(可能非常大的)对象列表,并以内存有效的方式只保留特定数量的对象 我似乎记得有某种数据结构可以做到这一点,但显然我在谷歌搜索方面做得很差。我假设无论它是什么结构,都会在某个地方有一个java实现。一个简单的方法是实现a(例如a),然后执行以下操作(伪代码啊!): 在

假设我想从任意数量的记录中找出最低的10个值。当我循环遍历记录时,我将它们添加到结构中,直到它达到我的最大大小10。之后,每次我添加一条不高于列表中最高记录的记录时,当前最高记录将被删除,保留最大记录数

或者更简单地说,我如何处理一个(可能非常大的)对象列表,并以内存有效的方式只保留特定数量的对象


我似乎记得有某种数据结构可以做到这一点,但显然我在谷歌搜索方面做得很差。我假设无论它是什么结构,都会在某个地方有一个java实现。

一个简单的方法是实现a(例如a),然后执行以下操作(伪代码啊!):

在此之后,
heap
将包含10个最小的元素


假设一个二进制堆,tihs需要
O(k)
额外的空间和
O(nlgk)
时间,其中
k
是您想要的元素数。

一个简单的方法是实现a(例如a)并执行以下操作(伪代码ahoy!):

在此之后,
heap
将包含10个最小的元素


假设一个二进制堆,tihs需要
O(k)
额外的空间和
O(n lg k)
时间,其中
k
是您想要的元素数。

如果您愿意在内存中保留所有n个值,可以使用二进制最小堆对数组进行堆化


它的构造需要O(n)个摊销时间,10个最小元素需要O(10*log(10)),也就是O(1)。

如果您愿意将所有n个值保留在内存中,可以使用二进制最小堆对数组进行堆化


它的构造需要O(n)个摊销时间,10个最小元素需要O(10*log(10)),也就是O(1)。

您可能会调整
PriorityQueue
来获得您想要的。这和我想的不完全一样(10年前的数据结构类有点模糊),但这应该可以做到!谢谢你说,塞巴斯蒂安的答案是一个近亲(<代码> PrimyReals由一个堆支持)。如果你想要一个更少的程序员和更多的计算机科学的答案,考虑一下。你可能会适应一个<代码> PrimoRealQuey/Cuth>得到你想要的东西。(10年前的数据结构类有点模糊),但这应该是个诀窍!感谢塞巴斯蒂安的答案是一个近亲(<代码> PrimyReals由一个堆支持),以防你需要更少的程序员和更多的计算机科学的答案,请考虑一下。
List elms; // original elements
Heap heap; // heap we store in

for element e in elms:
    push e onto heap
    if heap contains more than 10 elements:
        pop the max element from heap