算法-get到的循环不变量(栗子,二分法)

689 阅读1分钟

写作原因:在某些算法中,我们会涉及到使用循环才能够解决特定的问题,但是当涉及到循环中的语句表达的时候,就会涉及到边界的处理,有时候因为处理不好而导致不停的debug才会得到正确的结果,导致这些原因是因为我们没有好好的处理好边界问题,也就是没有真正的get到“循环不变量”的原因

正文: 当设计到一个有序的数组中,要查找到一个target值的时候,就会涉及到循环语句中判断的设计,这个时候我们就可以利用循环不变量来进行处理,直接上代码

function binarySearch(arr, target) {
  // 二分法来查找arr中的target值
  var left = 0,
    right = arr.length - 1; 
    // 表示在[left, right]的范围里边找到target的索引范围,要明白变量的意义
  while (left <= right) { // 当 left == right是,区间[left...right]范围依然有效,所以使用的是 <=
    var mid = Math.floor((left + right) / 2);
    if (arr[mid] == target) return mid;
    
    // 说明target在[mid+1, right]索引范围里边
    if (target > arr[mid]) left = mid + 1;
    
    else right = mid - 1; // target在[left, mid-1] 范围里边找

  }
  return -1; // 说明没有找到
}

console.log(binarySearch([1, 2, 3, 4, 5, 6], 3));

其实循环不变量的作用就是说我们的变量的意义要不变,始终要在有效的范围内,这是保证程序正确性的一种方法