测距时删除优先级队列中元素的安全方法

时间:2018-03-08 13:02:45

标签: go heap priority-queue

我从go documentation完全实现了优先级队列。 我想删除元素,如果它们满足某些条件。所以我应该:

  • 迭代队列然后
  • 检查条件
  • 如果条件正常,请删除元素

像这样:

for i, value := range pq{
  if someCondtion{
    heap.Remove(&pq, i)
  }

}

或者为了简单起见:

for i, value := range pq{
    heap.Remove(&pq, i)
}

但这不是安全的方法,因为有一个错误:

panic: runtime error: index out of range
goroutine 1 [running]:
main.PriorityQueue.Swap(...)
main.(*PriorityQueue).Swap(0xc420088020, 0x2, 0x0)
container/heap.Remove(0x4c69a0, 0xc420088020, 0x2, 0xf, 0x0)

我该怎么做呢? 以下是https://play.golang.org/p/XrQdAJIbZPw

的示例

2 个答案:

答案 0 :(得分:3)

每次调用heap.Remove后,都会重新组织堆。因此pq的初始长度在每个循环中变小。当它小于i要求的当前值时,您将达到该点。

如果你操纵pq,你必须按照例子中的方式循环:

for pq.Len() > 0 {
    item := heap.Pop(&pq).(*Item)
    fmt.Printf("%.2d:%s\n", item.priority, item.value)
}

请参阅https://play.golang.org/p/Ayt4_zLo8FF

答案 1 :(得分:3)

我认为您没有正确使用正确的数据结构或使用的数据结构。队列的想法是将项目放在最后以供将来处理,并从头开始处理项目以处理它们。

如果您不想处理某些项目,您可以在排队之前对其进行过滤,也可以在处理之前从队列中进行过滤。