获取树集 O(1) 时间中的最大元素
Getting biggest element in TreeSet O(1) time?
调用last()
会得到最大的元素,但它是O(logN)时间,我知道C++我可以利用迭代器并且调用rbegin()
是恒定时间,我可以在获得最大元素时使用Java的TreeSet实现这个恒定时间吗?
C++中的示例代码:
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
TreeSet 不跟踪提供对最大元素的常量时间访问所需的额外数据。这不太可能影响任何使用 TreeSet 的算法的时间复杂度,因为您必须执行比add()
或remove()
调用更多的last()
调用才能更改时间复杂度。
如果您确实执行了如此多的last()
调用,这很重要,则可以自己缓存last()
结果,并且仅在自上次调用以来修改了集合时才重新计算它。或者,优先级队列可能更适合您的用例。
(std::set
确实跟踪此数据的事实意味着它必须对重构集合的操作执行额外的工作,即使您不需要它。
相关文章:
- 使用堆查找第K个最大元素的时间复杂性
- 如何在 c++ stl 中获取列表中被推回的元素的地址,在常量时间内?
- 比较向量中的元素时所花费的时间呈指数级增长
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 将数组的元素插入映射的时间复杂度是多少?
- Deque 中元素的随机访问如何提供恒定的时间复杂度?
- 我们可以在队列前面以 O(1) 时间复杂度排队一个元素吗?
- 如何在对数时间内访问 c++ std::set 中的第 k 个元素?
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 包含每个 k 个列表中至少 1 个元素的最小元素范围的时间复杂度
- 在O(1)时间C 中找到堆栈中的最小元素
- 如何检查 O(N) 时间复杂度的多重集中是否有 2 个或更多元素具有相同的值
- 如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
- 从容器中获取随机元素,该容器在恒定时间内没有严格的元素顺序
- 对列表中的任意元素的常量时间访问 (C++)
- 在编译时间检查模板参数类型是否设置或多键,并且容器的元素类型是算术的
- DFS 访问内部的地图元素.时间复杂度
- 为什么我列表中的所有元素都有相同的创建时间
- O(1) 时间平衡二叉搜索时间中的最小/最大元素
- std::map 获取最低的 n 个元素时间