精确搜索

  1. function search(d, t) {
  2. let l = 0, r = d.length;
  3. while (l < r) {
  4. let m = ((r - l) >>> 1) + l;
  5. if (d[m] === t) {
  6. return m;
  7. } else if (d[m] > t) {
  8. r = m;
  9. } else if (d[m] < t) {
  10. l = m + 1;
  11. }
  12. }
  13. return -1;
  14. }

左边界搜索

  1. function left_search(d, t) {
  2. let l = 0, r = d.length;
  3. while (l < r) {
  4. let m = ((r - l) >>> 1) + l;
  5. if (d[m] === t) {
  6. r = m;
  7. } else if (d[m] > t) {
  8. r = m;
  9. } else if (d[m] < t) {
  10. l = m + 1;
  11. }
  12. }
  13. return l;
  14. }

右边界搜索

function left_search(d, t) {
  let l = 0, r = d.length;
  while (l < r) {
    let m = ((r - l) >>> 1) + l;
    if (d[m] === t) {
      l = m + 1;
    } else if (d[m] > t) {
      r = m;
    } else if (d[m] < t) {
      l = m + 1;
    }
  }
  return l;
}

三个的核心差别在与 === 条件时的后继处理差异。

精确搜索 return m; 找到目标对象,直接返回。
左边界搜索 r = m; 找左边界,那么当前这个可能是右边界,所以向左搜索
右边界搜索 l = m + 1; 找右边界,那么当前这个可能是左边界,所以向右搜索

PS:建议不要简写合并条件,不然,三种情况的的差异还要记忆条件组合。