typescript 增量返回不同的二进制搜索结果

8ftvxx2r  于 2022-11-30  发布在  TypeScript
关注(0)|答案(2)|浏览(131)

创建了一个简单的二进制搜索,我注意到使用mid--mid -= 1mid - 1返回不同的结果,基本上导致了函数失败。我的假设是--++操作符能够在每次迭代中更改mid的值...但它似乎非常细微,我没有真正跟踪什么“这是幕后的事。希望能在这方面得到一些帮助。
我认为mid -= 1mid--都意味着取mid并将它的值减1,两者实质上都是将-1的值重新分配给mid变量。
工程编号

const sourceArray = [1, 5, 7, 10, 15];

const binarySearch = (array, target) => {
  let low = 0;
  let high = array.length - 1;

  while (low < high) {
    let mid = (low + high) / 2;
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      // if array[mid] > target, set high to mid--
      high = mid--;
    } else {
      // if array[mid] < target, set low to mid++
      low = mid++;
    }
  }
  return [];
};

console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));

// returns
// 2
// 3
// 4
// []

不工作

const sourceArray = [1, 5, 7, 10, 15];

const binarySearch = (array, target) => {
  let low = 0;
  let high = array.length - 1;

  while (low < high) {
    let mid = (low + high) / 2;
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      // if array[mid] > target, set high to mid--
      high = mid -= 1;
    } else {
      // if array[mid] < target, set low to mid++
      low = mid += 1;
    }
  }
  return [];
};

console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));

// returns
// 2
// []
// []
// []
8i9zcol2

8i9zcol21#

后置递减运算子(--)会传回值,然后将其递减,因此如果mid为3,则您的行:

high = mid--;

high设置为3,然后将mid减1,mid中保留2。
在第二个示例中,同一行上有两个分配:

high = mid -= 1;

让我们再次使用值为3的mid的示例。一个语句中的多个赋值操作是从右向左进行的。首先,从mid中减去1,并将值2存储到mid中。然后,将2赋值给high

hl0ma9xz

hl0ma9xz2#

首先,while条件应该是low <= high。考虑使用一个单一元素的数组,它根本不会进入循环。
其次,您应该改用Math.floor((low + high) / 2);。假设lowhigh具有不同的奇偶校验。显然,mid将是一个小数值。例如,您将访问未定义的sourceArray[2.5]
最后,应该使用前缀increment和decrement,因为它们在递增和递减之后返回值,即--mid++mid
我对你的代码所做的修改:

const sourceArray = [1, 5, 7, 10, 15];

const binarySearch = (array, target) => {
  let low = 0;
  let high = array.length - 1;

  while (low <= high) {
    let mid = Math.floor((low + high) / 2);
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      // if array[mid] > target, set high to mid - 1
      high = --mid;
    } else {
      // if array[mid] < target, set low to mid + 1
      low = ++mid;
    }
  }
  return [];
};

console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));

相关问题