给定一组整数,如果一个元素的元素以递增的方式排序,我怎么能知道哪个整数在某个位置?例如,给定一组整数,我如何获得较小的整数或第二个较小的整数等
是否可以在对数时间内执行此操作?我的意思是,我知道有明显的方法可以做我所问的问题,但有没有在对数时间内有效的方法呢?
答案 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
。