【问题标题】:Is it possible to implement a heap without knowing the size of the input beforehand?是否可以在事先不知道输入大小的情况下实现堆?
【发布时间】:2016-10-19 15:07:09
【问题描述】:

说,我有一个未知大小的整数的连续输入。在任何时刻,当接收到 k 个元素作为输入时,我想要一个大小为 k 的堆。如果不事先初始化某个长度的数组,如何做到这一点?

【问题讨论】:

  • java.util.ArrayList 随着项目数量的增长重新分配支持数组。

标签: java algorithm data-structures heap


【解决方案1】:

使用基于二叉树的堆。您不需要知道大小限制。

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

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

Use ArrayList

why use ArrayList?

【讨论】:

    【解决方案2】:

    java.util.PriorityQueue 的底层数据结构是一个堆。我假设通过提到堆,您意味着您的数据具有排序功能。

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

    除非您自己对它们进行排序,否则像 ArrayList 这样的其他动态大小数据结构将不提供排序功能。

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-27
      • 2018-03-24
      • 2013-04-03
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多