当前位置: 首页 > 知识库问答 >
问题:

堆在 Dijkstra 算法中相对于二叉树的优势

通建安
2023-03-14

Dijkstra算法的一个标准实现使用堆来存储从起始节点S到所有未探测节点的距离。使用堆的理由是,我们可以有效地弹出与堆之间的最小距离,在<code>O(log n)

  • 从堆中弹出非 min 元素
  • 计算更新的距离
  • 将它们插入回堆中

我知道从堆中弹出非最小元素可以在O(log n)中完成,如果一个人知道该元素在堆中的位置。但是,我不明白在Dijkstra算法的情况下如何知道这个位置。听起来二叉查找树更合适。

更一般地说,我的理解是,堆唯一能比平衡的二叉搜索树做得更好的事情就是访问(不删除)min元素。我的理解是否正确?

共有1个答案

许奇
2023-03-14

然而,我无法理解在Dijkstra算法的情况下如何知道这个位置。

您需要一个额外的数组来跟踪元素在堆中的位置,或者在堆的元素中添加一个额外的数据成员。这必须在每次堆操作后更新。

堆唯一比平衡二叉查找树做得更好的是访问(不删除)min元素

甚至可以修改BST,除了根指针之外,还保留一个指向min元素的指针,使O(1)访问min(有效地将O(lg n)工作分摊到其他操作上)。

就最坏情况复杂性而言,堆的唯一优势是“heapify”算法,该算法通过在线性时间内重新排列其元素,将数组转换为堆。对于Dijkstra来说,这并不重要,因为它将进行O(lgn)的n个堆操作,每个操作的成本都是。

那么,堆的真正原因是常量。正确实现的堆只是一个连续的元素数组,而BST是一个指针结构。即使BST是在数组中实现的(如果从一开始就知道元素的数量,就像在Dijkstra中一样,也可以这样做),指针会占用更多的内存,并且导航它们比用于导航堆的整数运算花费更多的时间。

 类似资料:
  • 我正在编写dijkstra算法的代码,对于我们应该找到与当前使用的节点之间距离最小的节点的部分,我使用了一个数组,并完全遍历它来找出节点。 这部分可以用二进制堆代替,我们可以在O(1)时间内计算出节点,但是我们也在进一步的迭代中更新节点的距离,我将如何合并那个堆? 对于数组,我所要做的就是转到(ith-1)索引并更新该节点的值,但在二进制堆中不能做同样的事情,我必须进行完整的搜索以确定节点的位置,

  • 本文向大家介绍Ruby实现的最优二叉查找树算法,包括了Ruby实现的最优二叉查找树算法的使用技巧和注意事项,需要的朋友参考一下 算法导论上的伪码改写而成,加上导论的课后练习第一题的解的构造函数。

  • 我最近完成了一个项目的二进制搜索树,我正在工作。很顺利,我学到了很多。然而,现在我需要实现一个常规的二叉树...出于某种原因,这让我难倒了。 我正在寻找一种方法来做我的InsertNode功能... 通常在BST中,您只需检查数据 有谁能帮我实现一个函数,只需将一个新节点从左到右不按特定顺序添加到二叉树中? 以下是我的BST插页:

  • 在前面的部分中,你了解了称为队列的先进先出数据结构。队列的一个重要变种称为优先级队列。优先级队列的作用就像一个队列,你可以通过从前面删除一个项目来出队。然而,在优先级队列中,队列中的项的逻辑顺序由它们的优先级确定。最高优先级项在队列的前面,最低优先级的项在后面。因此,当你将项排入优先级队列时,新项可能会一直移动到前面。我们将在下一章中研究一些图算法看到优先级队列是有用的数据结构。 你可能想到了几种

  • 我在模拟中使用下面的代码。因为我一遍又一遍地调用dijkstra方法,性能对我来说非常关键。,我使用PriorityQueue将图的节点保持相对于它们到源的距离的升序。PriorityQueue为我提供了以O(log n)复杂度访问距离最小的节点。但是,要在重新计算节点距离后保持节点有序,我需要首先删除节点,而不是再次添加它。我想可能有更好的方法。我感谢任何反馈。提前感谢所有社区。

  • 本文向大家介绍算法题,trim二叉搜索树相关面试题,主要包含被问及算法题,trim二叉搜索树时的应答技巧和注意事项,需要的朋友参考一下 参考回答: C++版本