【问题标题】:How to get Index of element if found using Binary Search(Recursively)如果使用二分搜索(递归)找到元素,如何获取元素的索引
【发布时间】:2021-05-10 17:11:15
【问题描述】:

function getMiddle({right,left}) {
  return Math.floor((left + right) / 2);
}

function RecursivelyBinarySearch(arr, search) {
  let left = 0;
  let right = arr.length - 1;
  let middle = getMiddle({left,right});
  if (right >= left) {
    if (arr[middle] === search) {
      return middle;
    } else if (arr[middle] < search) {
      return RecursivelyBinarySearch(arr.slice(middle + 1, arr.length), search);
    } else {
      return RecursivelyBinarySearch(arr.slice(0, middle - 1), search)
    }
  }
  return -1;
}

let result = RecursivelyBinarySearch([1,5,7,9,10,20], 20);
console.log(result);

// RecursivelyBinarySearch([1,5,7,9,10,20], 20) RecursivelyBinarySearch 返回 0,但我希望它是 5, 是否可以在不传递原始数组的情况下执行此操作?

【问题讨论】:

  • 是的:return left + RecursivelyBinarySearch(...).
  • @Welbog- + 运算符如何处理数组? OP面临的问题是返回是原始数组的突变,它越来越小,直到数组中唯一剩余的值是搜索值。因此,该值的索引将始终为零。将零添加到数组(返回值)不是解决方案。
  • 解决方案也不是在二进制搜索中寻找数组索引,因为你会破坏算法的效率。还有其他算法可以实现这一目标。 (就像一个简单的 while 循环 - 更快,一个传统的 for 循环)。
  • 底线是你不能改变一个数组并期望得到原始元素中找到的元素的位置而不是每次都传递原始数组
  • @RandyCasburn 不确定您在读什么,但这会返回一个 int,并且添加下限将产生正确的结果,因为这说明了查看一半时省略的数组大小剩余数组。

标签: javascript recursion data-structures


【解决方案1】:

欢迎来到堆栈溢出!不传递原始数组是一个奇怪的请求。但我认为你有充分的理由这样做:)

关于您的 sn-p,您的二分搜索功能有误。对于最后一种 else 情况,您需要传递 arr.slice(0, middle) 而不是 middle - 1

现在对于您的原始问题,我们每次都需要传递数组的第一个索引,因为此信息对于找到原始索引至关重要(执行 arr.slice 时它会丢失)。您可以像下面这样修改您的功能以获得所需的结果。

function getMiddle({right,left}) {
  return Math.floor((left + right) / 2);
}

function RecursivelyBinarySearch(arr, search, first_idx) {
  let left = 0;
  let right = arr.length - 1;
  let middle = getMiddle({left,right});
  if (right >= left) {
    if (arr[middle] === search) {
      return middle + first_idx;
    } else if (arr[middle] < search) {
      return RecursivelyBinarySearch(arr.slice(middle + 1, arr.length), search, middle + first_idx + 1);
    } else {
      return RecursivelyBinarySearch(arr.slice(0, middle), search, first_idx)
    }
  }
  return -1;
}

let result = RecursivelyBinarySearch([1,5,7,9,10,20], 20, 0);
console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多