从BST获得最大值和最小值(C++与Java)

Getting max and min from BST (C++ vs Java)

本文关键字:C++ Java 最小值 BST 最大值      更新时间:2023-10-16

我知道,给定一个平衡的二进制搜索树,获得最小和最大元素需要O(logN),我想询问它们分别在C++和Java中的实现情况。

C++

std::set为例,通过调用*set.begin()/*set.rbegin()可以获得min/max,并且它是恒定时间。

Java

HashSet为例,可以通过调用HashSet.first()HashSet.last()来获得min/max,但它是对数时间。

我想知道这是否是因为std::set做了一些额外的技巧,总是更新beigin()rbegin()指针,如果是,有人能给我看那个代码吗?顺便说一句,为什么Java没有添加这个技巧,对我来说似乎很方便…

编辑:

我的问题可能不是很清楚,我想看看std::set是如何实现插入/擦除的,我很好奇begin()rbegin()迭代器在这些操作中是如何更新的。。

第2版:

我现在很困惑。假设我有以下代码:

set<int> s;
s.insert(5);
s.insert(3);
s.insert(7);
... // say I inserted a total of n elements.
s.insert(0);
s.insert(9999);
cout<<*s.begin()<<endl;  //0
cout<<*s.rbegin()<<endl; //9999

*s.begin()*s.rbegin()不是都是O(1)运算吗?你是说他们不是?s.rbegin()真的迭代到最后一个元素吗?

我的答案不是特定于语言的。要获取BST中的MINMAX,需要始终分别迭代到最左边或最右边的节点。该操作在O(height)中,大致可以是O(log n)

现在,为了优化这种检索,实现Tree的类总是可以存储指向最左边和最右边节点的两个额外指针,然后检索它们就变成了O(1)。当然,这些指针带来了在树中每次插入操作时更新它们的开销。

begin()rbegin()仅以恒定时间返回迭代器。迭代它们不是恒定的时间。

没有"begin()/rbegin()指针"。最小值和最大值是通过迭代到最左边或最右边的元素来达到的,就像在Java中一样,只有Java没有显式迭代器。