获取树集 O(1) 时间中的最大元素

Getting biggest element in TreeSet O(1) time?

本文关键字:元素 时间 获取      更新时间:2023-10-16

调用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确实跟踪此数据的事实意味着它必须对重构集合的操作执行额外的工作,即使您不需要它。

相关文章: