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

时间:2012-08-02 17:29:00

标签: java data-structures computer-science

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

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

我似乎记得有某种数据结构可以做到这一点,但显然我的谷歌搜索工作很糟糕。我认为它的任何结构都会在某处实现java实现。

2 个答案:

答案 0 :(得分:2)

如果您愿意将所有N值保留在内存中,则可以使用二进制最小堆来堆积数组。

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

答案 1 :(得分:1)

一种简单的方法是实现max-heap(例如binary heap)并执行以下操作(伪代码啊!):

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

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

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