【问题标题】:Minimum/maximum element in a balanced binary search time in O(1) timeO(1) 时间内平衡二分查找中的最小/最大元素
【发布时间】:2016-06-11 20:42:24
【问题描述】:

我知道我们可以在 O(logn) 时间内找到二叉搜索树中的最小值/最大值。但是 c++ 中的 map 为我们提供了恒定时间内的最小值/最大值。我们可以使用map::begin 找到地图中的最小元素,使用map::rbegin 找到最大元素。这两个操作都需要恒定的时间。任何人都可以提出一种方法来找到最小/最大 O(1) 吗?

【问题讨论】:

  • 与根一起存储另外两个指针。
  • std::map 通常是用搜索树实现的,所以你的意思是 std::unordered_map 它是通过哈希图实现的。由于哈希图不关心订单,我们无法在 O(1) 中找到最小值。当您想在 O(1) 中获得最小/最大值而不删除它时,我建议您使用最小堆或最大堆
  • @Exagon:我的意思是ordered_map。你可以看看 map::rbegin 和 map::begin。
  • @molbdnilo :由于删除也可能很频繁,因此更改指针将再次花费 O(logn) 时间。
  • @Shivam Mitra 是的,但是有序映射通常是通过二叉搜索树实现的,就像你说的 O(logn) 除了你在根中存储额外的指针,所以 min 和 max

标签: c++ algorithm dictionary tree binary-search-tree


【解决方案1】:

BST 未实现 C++ 映射。它由红黑树实现。如果你想通过 O(1) 在 BST 中找到 min/max,你可以将两个指针存储到树中最左边的节点和最右边的节点。 否则,您可以使用 minheap 或 maxheap 找出 O(1) 中的 min/max。

【讨论】:

  • 是的,我们可以做到。但是删除最小/最大节点会改变指针。这仍然需要 O(logn) 才能找到新的最小值/最大值。
  • 不,可以再次在 O(1) 中完成。即使您在删除过程中删除了 min 节点(假设),您也可以将 min 指针更新为 min 节点的中序后继。因此,在任何时候,您都可以在 O(1) 中获得 min,max 。您可以说您正在增加删除的复杂性。但这仍然是 O(logn) 。
  • 红黑树也是二叉搜索树,只是说
  • 但它是平衡的。通常,当我们谈论 BST 时,我们不会考虑平衡部分
  • 通常,如果我们谈论 BST,我们应该始终将其视为平衡 BST,因为保持搜索树平衡是一个恒定时间操作。
猜你喜欢
  • 2018-10-07
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2014-07-21
  • 2020-05-08
  • 1970-01-01
相关资源
最近更新 更多