[英]as3: fastest method to search next higher/lower value in unsorted array?
如何处理未排序的数组以获得下一个更高或更小的值?
var _myArray:Array = (1,pizza,2,6,8,test,11,16,17,cola)
_myArray.splice(4,1) // > remove number 8 !
trace(_myArray) // > array contains now: (1,pizza,2,6,test,11,16,17,cola)
我如何获得下一个更高的值(= 11)?
即使您的数组由于某种原因必须保持相同的未排序状态,您仍然可以使用排序。 而且我敢打赌,使用Flash的本机排序方法将比创建自己的方法快得多。 但是,您将不得不遍历整个数组一次:
var sortedArray : Array = [];
for ( var i:int = 0; i < _myArray.length; i++) {
var o:Object = _myArray[i];
// use only int values for sorting:
if (o is int) sortedArray.push ({index:i, value:o});
}
sortedArray.sortOn ("value", Array.NUMERIC);
结果将是所有整数值及其索引的排序数组。 然后,您可以遍历以下内容:
for each ( var n:Object in sortedArray) {
doSomethingWith (n.value);
}
sortedArray.sortOn ("index", Array.NUMERIC);
for ( var i:int = sortedArray.length-1; i >= 0; i-- ) {
_myArray.splice (sortedArray[i].index,1);
}
我要说的是,如果无法对数组进行排序,那么您就无能为力了,无法提高算法性能。 任何可用的解决方案都必须始终遍历数组中的每个项目,这意味着没有性能提升。 即使您使用了辅助映射器(或重复的排序数组),也必须在每次对主数组进行更改时重新计算它……不好!
我认为您有这样的事情:
private function getNext(array:Array, value:Number):Number {
var higher:Number = Number.MAX_VALUE;
var position:Number = NaN;
for (var i:int = 0; i < array.length; i++) {
if (!(array[i] is Number)) {
continue;
}
var currentNumber:Number = array[i];
if (currentNumber >= value && currentNumber < higher) {
higher = currentNumber;
position = i;
}
}
return position;
}
用法:
getNext(myArray, 8);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.