在TreeSet O(1)时间中获得最大元素?

时间:2016-06-04 17:38:37

标签: java c++ iterator binary-search-tree hashset

调用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

1 个答案:

答案 0 :(得分:1)

TreeSet不会跟踪提供对最大元素的恒定时间访问所需的额外数据。这不太可能影响使用TreeSet的任何算法的时间复杂度,因为您必须执行比last()add()调用更多的remove()调用才能更改时间的复杂性。

如果您确实执行了这么多last()次呼叫,您可以自己缓存last()结果,只有在您自上次呼叫后修改了该设置后才重新计算它。或者,PriorityQueue可能更适合您的用例。

std::set 跟踪此数据的事实意味着即使您不需要,它也必须对重组该设置的操作执行额外的工作。)