【问题标题】:Which one is better a balanced binary search tree or the max-heap for extracting the max element?哪一个更好是平衡二叉搜索树或最大堆提取最大元素?
【发布时间】:2017-10-07 19:41:19
【问题描述】:

由于平衡BST 将花费O(log(n)) 时间提取最大值(通过提取我的意思是查找和删除 Max 元素)。 另一方面,Max-heap 也需要 O(log(n)) 时间来提取最大元素。

他们中的任何人在 Extract-Max 操作中都比其他人更有优势吗?

【问题讨论】:

  • 我知道。但是,如果我们想要执行 extract-max 那种操作怎么办。那么哪一个是平衡 bst 或 max heap 的合适数据结构。
  • 在某些特殊情况下,BST 只需要比Heap 多进行一次操作,否则两者都可以在相同数量的操作中提取最大值。但这一项操作可以忽略不计。
  • @GAURANGVYAS 找到平衡 Bst 的最右边节点需要 O(log(n)),执行删除操作需要 O(1)。
  • 好的,找到最大元素需要 O(log n) 时间,因为我们需要找到最右边的元素,然后删除需要 O(1),因为它可能是叶节点或只有一个小孩。正确@ Sanket Makani 和@Satyendra

标签: algorithm data-structures binary-tree binary-search-tree binary-heap


【解决方案1】:

在考虑数据结构时,您应该考虑到它们在时间和空间上的复杂性。这里的空间是一样的,所以让我们关注时间:

平衡的 BST:

平衡 BST 保持 h = O(lg n) ⇒ 所有操作都在 O(lg n) 时间内运行。

最大堆

找到max O(1),删除max O(lg n)

这意味着它们的时间复杂度也相同。

通过阅读此answer,您也得出了相同的结论:

...最大堆或二叉树很合适。

但是,请注意,平衡已构建的 BST 是一个 O(n) 操作 (Balancing a BST)。因此,如果我也必须这样做,那么我会选择最大堆。

有关高级用法,请阅读Which data structure to use for accessing min/max in constant-time?


来源:12

【讨论】:

  • 那么您对此有何结论?
  • 因此对于该操作而言,在效率方面两者都很好。如果我是你,我会看看哪个更容易实现,或者我是否可以访问提供这种数据结构的库。例如,如果我在c++ 中写作,并且有一个我喜欢的库,它提供了一个堆,我会去那个!
  • 我认为平衡树是一种开销。而且我现在并不关心实现的简单性。
  • 哦,我认为问题是,鉴于我已经拥有这些数据结构,@SatyendraYadav 有什么更好的。是的,让我更新我的答案。顺便说一句,您可以提出一个新问题,而不是编辑您已经发布并得到答案的问题。这样我们就可以保持帖子的紧凑性! =)
  • @gsamaras 您提供了一个关于平衡 BST 的链接,但用户在那里平衡了一整棵树,该树最初是不平衡的。但是在这种情况下,仅在删除操作之后才需要重新平衡(并且仅在某些情况下也是如此),并且不会花费 O(n) 时间。平衡先前不平衡的树与在这种情况下执行的平衡不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多