1
1
一个简单的优先级堆应该适合您的需求。插入、删除和优先级更改都是O(log n)。但你通常说优先级的改变不会导致顺序的改变。因此,对于优先级堆,当您更改优先级时,您将对照父级和2个子级检查更改的项,如果没有违反任何堆条件,则不需要执行向上或向下堆操作。所以很少需要完整的O(log n)时间。实际上,它更像O(1)。 现在,为了有效地操作,重要的是给定一个项i,您可以在o(1)中找到该项在堆中的位置,并访问父项和子项。 如果堆只包含数组中的项,那么这只是指针算术。缺点是重新排序堆意味着复制项。 如果您在堆中存储指向项的指针,那么还必须将对堆中项自身位置的后引用存储起来。重新排序堆时,只交换指针并更新后引用。 |
2
1
基本上,您正在查找indexPriorityQueue。您可以根据需要实现自己的索引优先级队列变量。 索引优先级队列允许您减少键或增加键,即基本上可以增加和减少作业的优先级。 以下是索引实现的Java实现,希望对您有所帮助。 IndexMinQueue |
bryniek · Java:将队列作为方法参数传递? 7 年前 |
ekim420 · 堆如何知道按什么排序? 7 年前 |
Chase · 改进优先级队列堆中的密钥搜索时间复杂性 7 年前 |
ojas · 二维平面中的K个最近邻 7 年前 |