如何获取集合中某个位置的整数?

时间:2014-12-12 22:57:28

标签: c++ performance stl set binary-search-tree

给定一组整数,如果一个元素的元素以递增的方式排序,我怎么能知道哪个整数在某个位置?例如,给定一组整数,我如何获得较小的整数或第二个较小的整数等

是否可以在对数时间内执行此操作?我的意思是,我知道有明显的方法可以做我所问的问题,但有没有在对数时间内有效的方法呢?

2 个答案:

答案 0 :(得分:3)

std::set 的元素按递增顺序存储。

不,你不能在对数时间内在位置N找到项目 - 它需要线性时间。

auto start = your_set.begin();
std::advance(start, N);

理论上,可以在对数时间内完成,方法是让树的每个节点存储左边节点的计数(即按顺序排在前面),但是std::set即使它存在,也不要求或提供(标准化)界面来使用它。

答案 1 :(得分:0)

是的,如果您的元素已经排序("以越来越多的方式排序"),那么有一种方法可以在对数时间内搜索任意整数。使用二叉搜索树。显然,如果你想要最好的时间跨度,你会想要使用自平衡树(例如红黑树,avl树,......)。我相信C ++的选项是std::set的一部分。

但是,我并不确定你的意思是"获得较小的整数。"如果你的意思是,给定一组整数,找到最小元素,那么你将需要查找堆。堆比树更好地工作,因为在堆的情况下,查询最小值将在恒定时间内发生,而插入和删除在对数时间发生。我相信C ++的选项是std::priority_queue的一部分。

或者,如果您想要以最快的方式搜索整数,则可以使用哈希表,因为它们允许在预期的恒定时间内查询,并且会有恒定的时间插入。这方面的C ++选项是std::unordered_set