MinHeap和MaxHeap在Java中的实现

MinHeap和MaxHeap在Java中的实现,java,data-structures,Java,Data Structures,我想知道java是否有可以帮助我实现minheap和maxheap的集合。 我知道我可以使用PriortyQueue数据结构来实现maxheap。 我们可以用同样的方法来处理minheap吗?如果是,如何进行 谢谢, Manan我认为这是一种倒退:堆是实现优先级队列的一种方式。至于最小/最大部分,只需编写适当的比较器类。在这方面,您的抽象级别有点落后 堆是一种类似于树的数据结构(注意,它实际上不必有树,而是一种将数据点与其“子节点”(详见下文))关联的方法,它在节点及其子节点之间具有非常特定的关

我想知道java是否有可以帮助我实现minheap和maxheap的集合。 我知道我可以使用PriortyQueue数据结构来实现maxheap。 我们可以用同样的方法来处理minheap吗?如果是,如何进行

谢谢,
Manan

我认为这是一种倒退:堆是实现优先级队列的一种方式。至于最小/最大部分,只需编写适当的
比较器
类。

在这方面,您的抽象级别有点落后

堆是一种类似于树的数据结构(注意,它实际上不必有树,而是一种将数据点与其“子节点”(详见下文))关联的方法,它在节点及其子节点之间具有非常特定的关系

相反,优先级队列是一个更抽象的概念。它是一个队列(具有FIFO数据访问模型的类似列表的数据结构),但它不是实际的FIFO,而是首先返回优先级最高的对象

就像在堆中,有不同的方法实现底层结构一样,在优先级队列中,人们也可以做许多不同的事情。使用堆作为优先级队列的底层结构的好处是,您不必再做任何工作。只要根据优先级堆值,当有人请求值时,返回head

主要区别在于堆由它的树状属性和堆约束定义,其中作为优先级队列的堆约束仅由它与其他队列的交互方式定义

// A note on creating heaps
// Given that A is an array of n values indexed from 1 to n
// We can model a tree like structure buy stating that for any
// value i in (1,n) it's children are 2 * i and 2 * i + 1
// So with an array you can easily model a heap in this manner

那么它意味着插入优先级队列是O(n)?如果是这种情况,我是否需要编写自己的树状堆?如果实现正确,添加到常规队列应该是
O(1)
。至于插入优先级队列,这取决于您使用的底层数据结构的类型。如果您使用的是列表结构(如LinkedList),那么插入将是
O(n)
,因为您必须遍历整个列表才能插入。如果使用树状结构(比如堆),那么插入成本
O(logn)
,因为这是插入树的成本。优先级队列有点用词不当。它的功能通常不像队列。内置的PriorityQueue在Java中使用什么?树还是队列?我不知道-我假设一个堆状结构。这是一种相当标准的做法。