繁体   English   中英

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

[英]Most efficient way to find range in array

我有一个整数数组,可以是正数可以是负数:

[ -30, -13, -10, -4, -1, 4, 23, 55, 90, 234, 433, 500 ]

我需要找到大于或等于零的最小数字和小于或等于400的最大数字的索引。
最有效的方法是什么?
(我使用的是JavaScript,但是任何语言或伪代码都可以)

O(log N)

JSFiddle: http : //jsfiddle.net/vCY68/

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];
});

比较函数在此处返回2个值:第一个是此比较后要移动的位置。 第二是当前值是否可接受。

PS:为节省执行二进制搜索的时间,采用了http://oli.me.uk/2013/06/08/searching-javascript-arrays-with-a-binary-search/中的代码,并做了一些小改动

PPS:如果您手动初始化搜索范围并使用firstPositive + 1开始索引参数化第二个搜索,则可能会减少比较次数

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

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

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

您将需要2 O(logn)操作来实现此目的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM