是否可以在不事先知道输入大小的情况下实现堆?

时间:2016-10-19 05:34:51

标签: java algorithm data-structures heap

说,我有一个连续输入未知大小的整数。在任何时刻,在接收到k个元素作为输入时,我希望有一个大小为k的堆。如果不预先初始化一些长度的数组,怎么能实现呢?

2 个答案:

答案 0 :(得分:1)

使用基于二叉树的堆。您无需了解大小限制。

http://interactivepython.org/runestone/static/pythonds/Trees/BinaryHeapImplementation.html

即使使用基于数组的实现,当容量不足时,您也可以使用分配大小技巧的加倍。它将具有相同的时间复杂性。

Use ArrayList

why use ArrayList?

答案 1 :(得分:0)

java.util.PriorityQueue的基础数据结构是一堆。我假设通过提到堆,你打算在数据上有订购功能。

使用默认构造函数初始化PriorityQueue时,它会创建一个PriorityQueue,其默认初始容量(11)根据其自然顺序对其元素进行排序。如果您定义自定义Comparator,它将根据您的约束进行排序。

其他动态大小的数据结构(如ArrayList)不会提供排序顺序的功能,除非您对它们进行排序。

我认为你想要解决类似于运行流的第k个最小/最大元素的东西。如果是,您可以使用默认构造函数初始化PriorityQueue,并在推送每个元素时检查其当前大小是否为k。如果它的当前大小为k,请根据约束用新元素替换top元素。

最后,如果您只需要动态大小而不需要像堆这样的排序,请使用ArrayList