【发布时间】: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