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

时间:2014-02-10 23:01:34

标签: javascript arrays performance algorithm sorting

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

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

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

3 个答案:

答案 0 :(得分:1)

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个值:1st是比较后的移动位置。第二个是当前值是否可以接受。

PS:为了节省实施二进制搜索的时间,我们采用http://oli.me.uk/2013/06/08/searching-javascript-arrays-with-a-binary-search/的代码进行了一些修改

PPS:如果手动初始化搜索范围并使用firstPositive + 1起始索引参数化第二次搜索

,可能会减少比较次数

答案 1 :(得分:0)

在数组中进行二进制搜索0和400。如果你达到0或400那么这就是答案,否则检查你到达的数组元素以及左边或右边的元素,看看哪一个最大小于0或最大小于400.复杂性是O( log n)如果你的数组大小为n。

答案 2 :(得分:0)

二进制搜索大于0的最低元素以及数组中大于400的最高元素。

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

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