问题是“建议采用排序后的Array和X的算法,如果在数组中找不到X的索引,则它将返回Array的索引,返回-1,算法的时间复杂度应为O( log d),而d是小于X的元素数
除了查看中间索引并比较它是否小于X之外,我无法想到其他事情,然后递归执行相同的事情。但是我不认为它是O(log d)。我要提交作业,但不知道该怎么办。
答案 0 :(得分:1)
Exponential search是 O(log d)。
从upper = 0
开始,将值array[upper]
与value
比较。如果小于value
,请更新upper = (upper + 1) * 2;
直到array[upper] >= value
。如果相等,则返回upper
,否则在[upper / 2, upper)
之间执行binary search。
在JavaScript中,它看起来像这样:
function exponentialSearch (array, value) {
let upper = 0;
// exponential gallop
while (array[upper] < value) upper = (upper + 1) * 2;
if (array[upper] === value) return upper;
// binary search
for (let lower = upper / 2; upper > lower; ) {
const bisect = lower + Math.floor((upper - lower) / 2);
if (array[bisect] > value) upper = bisect;
else if (array[bisect] < value) lower = bisect;
else return bisect;
}
return -1;
}