【发布时间】:2016-10-19 15:07:09
【问题描述】:
说,我有一个未知大小的整数的连续输入。在任何时刻,当接收到 k 个元素作为输入时,我想要一个大小为 k 的堆。如果不事先初始化某个长度的数组,如何做到这一点?
【问题讨论】:
-
java.util.ArrayList 随着项目数量的增长重新分配支持数组。
标签: java algorithm data-structures heap
说,我有一个未知大小的整数的连续输入。在任何时刻,当接收到 k 个元素作为输入时,我想要一个大小为 k 的堆。如果不事先初始化某个长度的数组,如何做到这一点?
【问题讨论】:
标签: java algorithm data-structures heap
使用基于二叉树的堆。您不需要知道大小限制。
http://interactivepython.org/runestone/static/pythonds/Trees/BinaryHeapImplementation.html
即使使用基于数组的实现,您也可以在容量不足时使用双倍分配大小的技巧。它将具有相同的时间复杂度。
【讨论】:
java.util.PriorityQueue 的底层数据结构是一个堆。我假设通过提到堆,您意味着您的数据具有排序功能。
当您使用默认构造函数初始化 PriorityQueue 时,它会创建一个具有默认初始容量 (11) 的 PriorityQueue,它会根据元素的自然顺序对其元素进行排序。如果你定义了一个自定义的Comparator,它将根据你的约束进行排序。
除非您自己对它们进行排序,否则像 ArrayList 这样的其他动态大小数据结构将不提供排序功能。
我认为您想解决类似于正在运行的流的第 k 个最小/最大元素的问题。如果是,您可以使用默认构造函数初始化PriorityQueue,并在推送每个元素时检查其当前大小是否为k。如果当前大小为k,则根据您的约束将顶部元素替换为新元素。
最后,如果您只需要动态大小而不需要像堆这样的排序,请使用ArrayList。
【讨论】: