能给我O(logd)

时间:2019-03-22 20:24:18

标签: arrays algorithm sorting time-complexity

问题是“建议采用排序后的Array和X的算法,如果在数组中找不到X的索引,则它将返回Array的索引,返回-1,算法的时间复杂度应为O( log d),而d是小于X的元素数

除了查看中间索引并比较它是否小于X之外,我无法想到其他事情,然后递归执行相同的事情。但是我不认为它是O(log d)。我要提交作业,但不知道该怎么办。

1 个答案:

答案 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;
}