关于二进制搜索中的起始结束索引的困惑

时间:2019-05-27 12:19:32

标签: javascript binary-search

以下是此post中的二进制搜索。 s表示开始索引,e表示结束索引。我想我了解他们。

function bs(arr, tar) {
  let s = 0;
  let e = arr.length - 1;

  while(s <= e) {
    let m = Math.floor((s + e) / 2);

    if(tar === arr[m]) {
      return m;
    }

    if(tar > arr[m]) {
      s = m + 1; // follow index
    }

    if(tar < arr[m]) {
      e = m - 1; // follow index
    }
  }

  return -1;
}

let arr = [1, 2, 3, 4, 5, 6, 7];
let tar = 5;
let out = bs(arr, tar);
console.log(out);

有时候我也看到这个版本:

function bs(arr, tar) {
  let s = 0;
  let e = arr.length; // full len

  while(s < e) {
    let m = Math.floor((s + e) / 2);

    if(tar === arr[m]) {
      return m;
    }

    if(tar > arr[m]) {
      s = m + 1; // because s=0;
    }

    // end, exact index
    if(tar < arr[m]) {
      e = m; // not m-1, because arr.length???
    }
  }

  return -1;
}

let arr = [1, 2, 3, 4, 5, 6, 7];
let tar = 5;
let out = bs(arr, tar);
console.log(out);

我认为一段时间后,我明白了索引的含义。

1 个答案:

答案 0 :(得分:0)

二进制搜索需要一个有序列表才能工作,例如数字列表。这个想法是在右半部分搜索一个元素,这是可能的,因为该算法收敛到一个。假设您有一个包含10(1、10、54、70、100、110、120、130、150、200)个数字的列表,并且正在寻找120。将列表分为两半并寻找中间元素(100)120是否大于100?是的,因此元素位于列表的下半部分,现在起点是列表的中间位置,结束位置是列表的末尾,继续操作直到找到一个元素(要查找的元素)。希望这对您有帮助