我从golang docs完全实现了优先级队列。我有兴趣一次删除多个元素,如heap.Remove(&queue, index1, index2, ...)
。
现在可以用直截了当的方式完成:
for _, event := range events {
heap.Remove(&queue, event.getIndex())
}
但是这种方法有一个开销,因为每次调用heap.Remove
都会重新组织树。如果我们可以首先删除所有不必要的元素,然后重新组织树,这似乎更有效。
如何实施?
答案 0 :(得分:2)
由于堆的基础数据结构是一个切片,因此可以直接从切片中删除元素,然后再重新初始化堆。
从你的例子开始:
for _, event := range events {
i := event.GetIndex()
queue[i], queue[len(queue)-1] = queue[len(queue)-1], queue[i]
queue = queue[:len(queue)-1]
}
heap.Init(&queue)
一个有效的例子:https://play.golang.org/p/-KMEilCm3t9
func main() {
h := IntHeap{1, 5, 2, 9, 8, 3, 7}
toRemove := 8
for i := 0; i < len(h); i++ {
n := h[i]
if n == toRemove {
h[i], h[len(h)-1] = h[len(h)-1], h[i]
h = h[:len(h)-1]
i--
}
}
heap.Init(&h)
fmt.Println(h)
}
答案 1 :(得分:1)