javascript - 如果使用二分搜索(递归)找到元素,如何获取元素的索引
问题描述
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,是否可以在不传递原始数组的情况下执行此操作?
解决方案
欢迎来到堆栈溢出!不传递原始数组是一个奇怪的请求。但我认为你有一个很好的理由:)
关于您的代码段,您的二进制搜索功能中有错误。对于最后一种 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);
推荐阅读
- python - 如何使异步工作?我无法理解问题
- php -
文件名:wp-content/themes/ewebot/functions.php 文件类型:不是 wordpress.org 的核心、主题或插件文件。详细信息:此文
- python - 从 lineEdit 获得的值无法传递给线程
- c++ - 为什么我的第二个功能(push2())不起作用?
- javascript - 将具有特定位置的多个对象分组三个js
- vb.net - 删除另一个面板内的面板
- python - 如何在不创建本地副本的情况下从在线 gzip 文件中读取数据?
- lambda - 如何为 serverless.yml 中的所有功能设置默认授权人
- html - 根据父 div 更改嵌套子 div
- php - Codeigniter - 不显示任何数据