从索引优先级队列中删除(java)

时间:2018-10-14 23:08:06

标签: java data-structures heap priority-queue indexed

我有一个作为堆实现的索引最小优先级队列。删除索引元素时,代码为:

var mergedObj = { ...obj1, ...obj2 };

其余代码可在此处找到:https://algs4.cs.princeton.edu/24pq/IndexMinPQ.java.html

由于 public void delete(int i) { if (i < 0 || i >= maxN) throw new IllegalArgumentException(); if (!contains(i)) throw new NoSuchElementException("index is not in the priority queue"); int index = qp[i]; exch(index, n--); swim(index); // Why is this needed? sink(index); keys[i] = null; qp[i] = -1; } pq[N中的最后一个元素,并且它与pq[]中的元素(将被删除)交换,所以这并不意味着该值交换之后pq[i]处的值大于或等于交换之前pq[i]处的值?问题是,为什么我们必须全部调用pq[i],而不仅是swim(i)?在哪种特定条件下交换后需要调用sink(i)

(有3个数组,swim(i)qp[]带有相应的索引,以及keys[]使得pq[] = qp[pq[i]] = pq[qp[i]]。 )

1 个答案:

答案 0 :(得分:1)

  

由于pq [N]是pq []中的最后一个元素,并且与pq [i]处的元素(将被删除)交换,因此这并不意味着pq [i]中的值交换之后大于或等于交换之前的pq [i]?

不,不一定是真的。有效堆的唯一要求是,子级不能大于其父级。虽然这意味着第一个位置的元素最小,但并不意味着最后一个位置的元素最大。考虑以下堆:

                1
      10                 2  
  15       18        5        3
16  17   19  20    7   8    6   4

pq[N]4,但是该堆中有很多元素大于它。假设我们想通过将15替换为4来删除它。 410小,因此必须向上移动树(使用swim)。