我正在为即将到来的CS考试练习一些练习题集。我希望我能帮助找出这个算法的伪代码:
给定已按升序排序的
n
整数数组,我需要给出一个算法的伪代码描述,以便在具有复杂度O(r + logn)
的A上执行范围搜索,其中{{1输出点的数量。换句话说,给定一个封闭的时间间隔r
,输出所有数组元素[lo, hi]
,其中A[i]
。
我理解复杂性的'lo <= A[i] <= hi
'部分只是输出区间内的元素(将它们放在算法中的单独数组中)。
我不太清楚如何做到这一点。假设只是一种算法。递归是必要的吗?由于算法必须是r
,因此不断划分数组似乎是一个想法。我对如何实现它感到困惑。
答案 0 :(得分:2)
作为提示,请考虑如何调整binary search algorithm以查找大于或等于lo
的第一个元素以及小于或等于hi
的最后一个元素。每次搜索需要多长时间?你会如何以这种方式修改二进制搜索?
答案 1 :(得分:2)
“不断划分阵列”是正确的。如果你通过每次分成两半来做到这一点,这称为“二分搜索”,实际上是O(log(n))。
您必须进行两次搜索,一次针对hi
,一次针对lo
,但这不会改变复杂度的顺序,因为我们乘以一定数量的迭代次数。