Java 使用链表实现二进制堆
可能重复:Java 使用链表实现二进制堆,java,algorithm,heap,binary-tree,Java,Algorithm,Heap,Binary Tree,可能重复: 您好 在二进制堆的链表实现中,我很难找到一种算法来确定树节点的位置。我已经使用数组实现了堆,现在我想尝试使用链表;如果我使用数组来表示堆,是否有办法找到其数组索引为的树节点?看一看看一看有什么意义?链表实现将比基于数组的实现更慢或更复杂。如果用一个简单的链表替换数组,并且不添加其他结构,那么插入时间将是O(n)而不是O(logn),然后您还可以以相同的O(n)复杂度维护一个排序列表。这有什么意义?链表实现将比基于数组的实现更慢或更复杂。如果用简单的链表替换数组,并且不添加其他结构,
您好
在二进制堆的链表实现中,我很难找到一种算法来确定树节点的位置。我已经使用数组实现了堆,现在我想尝试使用链表;如果我使用数组来表示堆,是否有办法找到其数组索引为的树节点?看一看看一看有什么意义?链表实现将比基于数组的实现更慢或更复杂。如果用一个简单的链表替换数组,并且不添加其他结构,那么插入时间将是O(n)而不是O(logn),然后您还可以以相同的O(n)复杂度维护一个排序列表。这有什么意义?链表实现将比基于数组的实现更慢或更复杂。如果用简单的链表替换数组,并且不添加其他结构,则插入时间将是O(n)而不是O(logn),然后您还可以以相同的O(n)复杂度维护排序列表。二进制堆并不总是更好。可以使用无序链表实现堆。它将有
O(1)
insert和O(n)
删除大小为n的列表的时间复杂度。对于删除和插入,二进制堆是O(n log n)
。如果您只需要执行少量(即常量)的删除,则可以使用链表。在实际操作中,这方面的一个很好的例子是使用Dijkstra算法的堆,其中需要插入和删除。在这种情况下,如果你有一个稠密的图,链表肯定会更好,但是对于稀疏的图,二进制堆更好。二进制堆并不总是更好。可以使用无序链表实现堆。它将有O(1)
insert和O(n)
删除大小为n的列表的时间复杂度。对于删除和插入,二进制堆是O(n log n)
。如果您只需要执行少量(即常量)的删除,则可以使用链表。在实际操作中,这方面的一个很好的例子是使用Dijkstra算法的堆,其中需要插入和删除。在这种情况下,如果有一个稠密图,链表肯定会更好,但是对于稀疏图,二进制堆会更好。