JavaScript,在给定数字

时间:2017-08-29 09:43:11

标签: javascript arrays algorithm

我不确定我是否正确描述了这个问题,所以我举一个简单的例子 假设我有一个数组:

var array = [0, 1.1, 2, 2.4, 4, 4.6, 5];  

给出一个数字,2.1
我想找到它所属的索引间隔。 对于这个问题,答案是2,3 目前我对此有两个想法,第一个是简单但非常慢,这是遍历整个数组并找到array [i-1]小于2.1且array [i]大于2.1的位置。
另一种方法是,向数组中添加2.1,按升序对数组进行排序,答案将是2.1的索引,以及此索引 - 1.
还有其他更好的建议吗?

3 个答案:

答案 0 :(得分:1)

你会进行二元搜索:



function binarySearch(array, el) {
    var m = 0;
    var n = array.length - 1;
    while (m <= n) {
        var k = (n + m) >> 1;
        var cmp = el - array[k];
        if (cmp > 0) {
            m = k + 1;
        } else if(cmp < 0) {
            n = k - 1;
        } else {
            return [k, k + 1];
        }
    }
    return [n, n+1];
}

var range = binarySearch([0, 1.1, 2, 2.4, 4, 4.6, 5], 2.3);

console.log(range);
&#13;
&#13;
&#13;

以上代码:

  • 假设数组元素都是不同的并按升序排序
  • 返回一对索引[i, i+1]
  • 返回array[i] <= el < array[i+1]
  • 这样的索引对
  • 如果给定的值超出了数组的范围,则当它低于第一个数组值时输出为[-1, 0],或者当它大于最后一个数组值时输出为[n-1, n]n是数组的长度。
  • O(log(n))时间复杂度。

答案 1 :(得分:0)

可以使用binary insert算法实现。

复杂度:

best案例中 O(1),在最坏的情况下 O(N)。即使Binary Insert本身仅为O(log(N))O(N)也来自插入,如果您在开头插入值,则最差情况下始终为O(N) - 你必须将剩余的值(N)推到最后。

例如,O(n)将在后续数组中推送4let array=[3,6,9,10,20,21,23,24,26]

搜索需要O(log(N)),添加需要O(n)

二进制插入的工作原理: enter image description here

var array = [0, 1.1, 2, 2.4, 4, 4.6, 5];
function binaryInsert(value, array, startVal, endVal){

	var length = array.length;
	var start = typeof(startVal) != 'undefined' ? startVal : 0;
	var end = typeof(endVal) != 'undefined' ? endVal : length - 1;
	var m = start + Math.floor((end - start)/2);
	
	if(length == 0){
		array.push(value);
		return;
	}

	if(value > array[end]){
		array.splice(end + 1, 0, value);
		return;
	}

	if(value < array[start]){
		array.splice(start, 0, value);
		return;
	}

	if(start >= end){
		return;
	}

	if(value < array[m]){
		binaryInsert(value, array, start, m - 1);
		return;
	}

	if(value > array[m]){
		binaryInsert(value, array, m + 1, end);
		return;
	}
}
let number=2.1;
binaryInsert(number, array,0,array.length);
console.log(array.toString());
let index=array.indexOf(number);
console.log(index-1,index);

答案 2 :(得分:0)

您可以使用简单的快速插入式插入功能

var array = [0, 1.1, 2, 2.4, 4, 4.6, 5];
var element = 2.1;
function insert(element, array) {
  array.splice(locationOf(element, array) + 1, 0, element);
  return array;
}

function locationOf(element, array, start, end) {
  start = start || 0;
  end = end || array.length;
  var pivot = parseInt(start + (end - start) / 2, 10);
  if (end-start <= 1 || array[pivot] === element) return pivot;
  if (array[pivot] < element) {
    return locationOf(element, array, pivot, end);
  } else {
    return locationOf(element, array, start, pivot);
  }
}

console.log(insert(element, array));