当我们不得不将Entry引用传递给函数remove(k),replaceKey(k)时,适应性优先级队列(键的基于列表的堆)中Position的用途是什么。 即,如果我对队列中的条目有一些引用“ ref”,那么我可以简单地调用remove(ref)和replaceKey(ref),这仍然需要O(1)的时间。为什么我需要特殊职位?
答案 0 :(得分:1)
将堆实现为链接列表根本没有任何意义。堆本质上是完整的二叉树。您可以将堆存储在数组中,因为它很容易计算节点的子节点的数组索引:位置i处的节点的子节点位于2i +1和2i + 2处。查找数组的ith元素比链接列表的ith元素效率高得多。
对于可适应性优先级队列,array(heaps)是对位置实例的一系列引用,每个位置实例存储键,值和数组中该项的当前索引。当我们在堆上执行优先级队列操作并重新放置项目时,将为用户提供每个插入元素的Position实例的引用。 在我们的结构中,我们将位置实例重新放置在数组中,然后 更新每个位置的第三个字段以反映其在数组中的新索引,并且更新将花费O(log(n))时间复杂度。