在一定范围内获得大致均匀间隔的整数?

时间:2013-09-20 22:52:54

标签: algorithm

我有一个未知长度的数组。

我想找到五个沿数组大致均匀分布的索引值,并且始终包含第一个和最后一个值。

例如,如果我有一个长度为20的数组,我想要索引值:

0, 4, 9, 14, 19

回。

当然,如果数组长度没有整齐地除以5,这就变得更加棘手。

关于最佳方法的任何聪明的想法?

3 个答案:

答案 0 :(得分:0)

我希望这适合你:

function range(start, end){
  var ra = [];
  for(var i=0,s=start,l=end-s+1; i<l; i++,s++){
    ra[i] = s;
  }
  return ra;
}
function arrayEvery(yourArray, start, every){
  var newArray = [], yl = yourArray.length;
  var al = yl % every === 0 ? yl/every : Math.ceil((yl-start)/every);
  for(var i=start,n=0; n<al; i+=every,n++){
    newArray[n] = yourArray[i];
  }
  if(newArray[0] !== yourArray[0])newArray.unshift(yourArray[0]);
  if(newArray[newArray.length-1] === yourArray[yl-1]){
    return newArray;
  }
  else{
    newArray.push(yourArray[yl-1]);
    return newArray;
  }
}
var zeroNineteen = arrayEvery(range(0, 19), 4, 5);
var zeroSeventeen = arrayEvery(range(0, 17), 4, 5);
var fourThirtyTwo = arrayEvery(range(4, 32), 7, 3);
var threeFiftyThree = arrayEvery(range(3, 53), 8, 7);
console.log(zeroNineteen); console.log(zeroSeventeen);
console.log(fourThirtyTwo); console.log(threeFiftyThree);

答案 1 :(得分:0)

如果您想拥有n个索引值,则应将长度除以(n - 1)并取a[0]a[res]a[2*res],... ,a[(n - 1)*res]a[length - 1]其中resfloor(length / (n - 1))fiddle):

function foo(rangeLow,rangeHigh,wanted) {
    var increment=Math.floor((rangeHigh-rangeLow)/(wanted - 1));
    var r = [rangeLow];
    for (var i = 1; i < wanted - 1; ++i){
        r.push(i * increment + rangeLow);
    }
    r.push(rangeHigh)
    console.log('r', r);
    return r;
}

foo(0, 19, 5) // result: 0 4 8 12 19

如果您想要一个更均匀分布的结果,您可以在将值推送到数组之前应用Math.round,而不是事先对增量进行拼接(结果为[0,5,10,14,19]fiddle

答案 2 :(得分:0)

jsFiddle Demo

如果您有阵列

var array = get();

然后检查长度并使用这些数字

var first = 0;
var last = array.length;
var skip = parseInt(array.length / 4);
for( var i = first; i < last; i += skip ){
 //work with array[i]
 console.log(i);
}