【发布时间】:2016-06-04 00:07:38
【问题描述】:
我知道给定一个平衡的二叉搜索树,获取最小和最大元素需要 O(logN),我想分别询问它们在 C++ 和 Java 中的实现。
C++
以std::set 为例,调用*set.begin() / *set.rbegin() 可以得到最小值/最大值,并且是常数时间。
Java
以HashSet 为例,可以通过调用HashSet.first() 和HashSet.last() 来获取最小值/最大值,但它是对数时间。
我想知道这是否是因为std::set 做了一些额外的技巧来始终更新beigin() 和rbegin() 指针,如果是这样,谁能告诉我那个代码?顺便说一句,为什么 Java 没有添加这个技巧,这对我来说似乎很方便......
编辑:
我的问题可能不是很清楚,我想看看 std::set 是如何实现 insert/erase 的,我很想知道 begin() 和 rbegin() 迭代器在这些操作期间是如何更新的..
EDIT2:
我现在很困惑。假设我有以下代码:
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() 实际上迭代到最后一个元素?
【问题讨论】:
标签: java c++ data-structures binary-search-tree