Javascript 在数组中查找范围的最有效方法

Javascript 在数组中查找范围的最有效方法,javascript,arrays,performance,algorithm,sorting,Javascript,Arrays,Performance,Algorithm,Sorting,我有一个整数排序数组,可以是正的,也可以是负的: [ -30, -13, -10, -4, -1, 4, 23, 55, 90, 234, 433, 500 ] 我需要找到大于或等于零的最小数字和小于或等于400的最大数字的索引。 最有效的方法是什么? (我正在使用JavaScript,但任何语言或伪代码都可以)对数组中的0和400进行二进制搜索。如果您点击0或400,则这就是答案,否则请检查您到达的数组元素以及左侧或右侧的元素,以查看哪个元素最大值小于0或最大值小于400。如果数组大小为n,

我有一个整数排序数组,可以是正的,也可以是负的:

[ -30, -13, -10, -4, -1, 4, 23, 55, 90, 234, 433, 500 ]
我需要找到大于或等于零的最小数字和小于或等于400的最大数字的索引。
最有效的方法是什么?

(我正在使用JavaScript,但任何语言或伪代码都可以)

对数组中的0和400进行二进制搜索。如果您点击0或400,则这就是答案,否则请检查您到达的数组元素以及左侧或右侧的元素,以查看哪个元素最大值小于0或最大值小于400。如果数组大小为n,则复杂性为O(logn)。

对数组中的0和400进行二进制搜索。如果您点击0或400,则这就是答案,否则请检查您到达的数组元素以及左侧或右侧的元素,以查看哪个元素最大值小于0或最大值小于400。如果数组大小为n,则复杂性为O(logn)。

对数组中的0和400进行二进制搜索。如果您点击0或400,则这就是答案,否则请检查您到达的数组元素以及左侧或右侧的元素,以查看哪个元素最大值小于0或最大值小于400。如果数组大小为n,则复杂性为O(logn)。

对数组中的0和400进行二进制搜索。如果您点击0或400,则这就是答案,否则请检查您到达的数组元素以及左侧或右侧的元素,以查看哪个元素最大值小于0或最大值小于400。如果数组大小为n,则复杂性为O(logn)。

O(logn)

JSFiddle:

函数binaryIndexOf(数据、条件){
"严格使用",;
var-minIndex=0;
var maxIndex=data.length-1;
var电流指数;
无功电流元件;
var结果=null;
while(minindex400?['left',false]:['right',true];
});
这里的比较函数返回2个值:第一个值是比较后的移动位置。第二个是当前值是否可接受

PS:为了节省实现二进制搜索的时间,代码是从中提取的,只是做了一些小的修改

PPS:如果手动初始化搜索范围并使用
firstPositive+1
start index

O(log N)

JSFiddle:

函数binaryIndexOf(数据、条件){
"严格使用",;
var-minIndex=0;
var maxIndex=data.length-1;
var电流指数;
无功电流元件;
var结果=null;
while(minindex400?['left',false]:['right',true];
});
这里的比较函数返回2个值:第一个值是比较后的移动位置。第二个是当前值是否可接受

PS:为了节省实现二进制搜索的时间,代码是从中提取的,只是做了一些小的修改

PPS:如果手动初始化搜索范围并使用
firstPositive+1
start index

O(log N)

JSFiddle:

函数binaryIndexOf(数据、条件){
"严格使用",;
var-minIndex=0;
var maxIndex=data.length-1;
var电流指数;
无功电流元件;
var结果=null;
while(minindex400?['left',false]:['right',true];
});
这里的比较函数返回2个值:第一个值是比较后的移动位置。第二个是当前值是否可接受

PS:为了节省实现二进制搜索的时间,代码是从中提取的,只是做了一些小的修改

PPS:如果手动初始化搜索范围并使用
firstPositive+1
start index

O(log N)

JSFiddle:

函数binaryIndexOf(数据、条件){
"严格使用",;
var-minIndex=0;
var maxIndex=data.length-1;
var电流指数;
无功电流元件;
var结果=null;
while(minindex400?['left',false]:['right',true];
});
这里的比较函数返回2个值:第一个值是比较后的移动位置。第二个是当前值是否可接受

PS:为了节省实现二进制搜索的时间,代码是从中提取的,只是做了一些小的修改


PPS:如果手动初始化搜索范围并使用
firstPositive+1
start index

对数组中大于0的最低元素和大于400的最高元素进行二进制搜索,则可能会减少比较次数

您需要在搜索中做一些轻微的修改,以便每次检查索引旁边的元素是否仍在减少或增加。例如:如果您达到值3,且前一个元素为-2,则3将是您的答案(即,您搜索下一个最高或最低值,而不是比较是否相等)


您需要2个O(logn)操作才能实现此目的。

对数组中大于0的最低元素和大于400的最高元素进行二进制搜索

您需要在搜索中做一些轻微的修改,以便每次检查索引旁边的元素是否仍在减少或增加。例如:如果您达到值3,且前一个元素为-2,则3将是您的答案(即,您搜索下一个最高或最低值,而不是比较是否相等)


您需要2个O(logn)操作才能实现此目的。

对数组中大于0的最低元素和大于400的最高元素进行二进制搜索

您需要在搜索中做一些轻微的修改,以便每次检查索引旁边的元素是否仍在减少或增加。例如:如果您达到值3,并且前一个元素为-2,那么3将是您的答案(即
function binaryIndexOf(data, criteria) {
  'use strict';

  var minIndex = 0;
  var maxIndex = data.length - 1;
  var currentIndex;
  var currentElement;
  var result = null;

  while (minIndex <= maxIndex) {
      currentIndex = (minIndex + maxIndex) / 2 | 0;
      currentElement = data[currentIndex];
      var comparison = criteria(currentElement);

      if (comparison[0] == 'right') {
          minIndex = currentIndex + 1;
      } else {
          maxIndex = currentIndex - 1;
      }

      if (comparison[1]) {
          result = currentIndex;
      }
  }

  return result;
}

var firstPositive = binaryIndexOf(data, function(value) {
    return value < 0 ? ['right', false] : ['left', true];
});

var lastLess400 = binaryIndexOf(data, function(value) {
    return value > 400 ? ['left', false] : ['right', true];
});