java - 自适应优先队列中位置的使用
问题描述
当我们必须将条目引用传递给函数 remove(k)、replaceKey(k) 时,自适应优先级队列(基于列表的键堆)中的位置有什么用。即,如果我对队列中的条目有一些引用“ref”,那么我可以简单地调用 remove(ref) 和 replaceKey(ref),这仍然需要 O(1) 时间。为什么我需要为此提供特殊职位?
解决方案
将堆实现为链表根本没有任何意义。堆本质上是几乎完全的二叉树。您可以将堆存储在数组中,因为计算节点子节点的数组索引很容易:位置 i 的节点的子节点位于位置 2i + 1 和 2i+2。查找数组的第 i 个元素比查找链表的第 i 个元素要高效得多。
对于自适应优先级队列,array(heaps) 是对位置实例的引用序列,每个位置实例存储一个键、值和数组中项目的当前索引。用户将获得每个插入元素的位置实例的引用。当我们在堆上执行优先级队列操作,并且项目在我们的结构中重新定位时,我们在数组中重新定位位置实例并更新每个位置的第三个字段位置以反映其在数组中的新索引,并且更新将花费 O(log(n)) 时间复杂度。
推荐阅读
- python - Python 如何管理整数和浮点数的大小?
- python - 如何从fastapi中的另一个api调用一个api?
- r - read_excel 无法读取 xls(MS excel 5.0/95 工作簿),但可以通过另存为 .xlsx 读取
- javascript - 使用对象克隆方法和for循环将对象推入数组,对象仍然是相同的引用,并且在数组中是相同的
- javascript - React + Socket IO:访问第一条消息
- email - 允许对 SQL 数据库进行邮件传递
- image - 用于 JasperReport 中的图像的 Samba 共享
- java - Java - 停止执行并稍后恢复
- assembly - 如何在 sparc V8 处理器中设置 TBR?
- javascript - AdonisJs 图片上传