从BST获得最大值和最小值(C++与Java)
Getting max and min from BST (C++ vs Java)
我知道,给定一个平衡的二进制搜索树,获得最小和最大元素需要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
中的MIN
或MAX
,需要始终分别迭代到最左边或最右边的节点。该操作在O(height)
中,大致可以是O(log n)
。
现在,为了优化这种检索,实现Tree
的类总是可以存储指向最左边和最右边节点的两个额外指针,然后检索它们就变成了O(1)
。当然,这些指针带来了在树中每次插入操作时更新它们的开销。
begin()
和rbegin()
仅以恒定时间返回迭代器。迭代它们不是恒定的时间。
没有"begin()/rbegin()
指针"。最小值和最大值是通过迭代到最左边或最右边的元素来达到的,就像在Java中一样,只有Java没有显式迭代器。
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?