[英]Function slows down when working with high numbers
我編寫了一個腳本,而不是給出一組數據的真實平均值,而是返回一個包含大多數數據點的窗口。 讓我顯示一些代碼:
time.tic()
var selectedAverage = 0;
var highestPointCount = 0;
for (var i = 1; (i*step) <= maxValue; i++) {
var dataPointCount = 0;
for (var j = 0; j < myArray.length; j++) {
if (myArray[j] >= minValue+(i-1)*step && myArray[j] <= minValue+i*step) {
dataPointCount++;
}
}
if (dataPointCount > highestPointCount) {
highestPointCount = dataPointCount;
selectedAverage = (minValue+(i-1)*step)+Math.round(0.5*step);
}
}
console.log(time.toct().ms)
return selectedAverage;
首先,通過從最大值中減去最小值然后確定10,來計算步長值。因此,有10個“水平”窗口。 然后,腳本會計算每個窗口內的數據點數量,並返回適當的平均值。
但是,當傳入一個較大的數字數組(例如1.000.000)時,腳本會非常慢(有時超過200倍)。 數組的長度大約為200,但總是相同的長度,因此必須與實際值相關聯。 知道哪里出了問題嗎?
編輯:獲得步驟值的代碼:
var minValue = myArray.min();
var maxValue = myArray.max();
var step = Math.round((maxValue-minValue)/10);
if (step === 0) {
step = 1
}
.min()和.max()是附加到Array的原型。 但這一切進行得非常快。 我已經測量了每個步驟,並且for循環變慢了。
我想到您的問題有兩件事:
在嵌套代碼中,每次都為minValue
, i
和step
的相同值計算minValue+(i-1)*step
和minValue+i*step
step
。 您應該在第二個for循環之前將其上拉:
var dataPointCount = 0;
var lowerLimit = minValue+(i-1)*step;
var higherLimit = minValue+1*step;
for (var j = 0; j < myArray.length; j++) {
if (myArray[j] >= lowerLimit && myArray[j] <= higherLimit) {
dataPointCount++;
}
}
如果我正確理解了您的算法,這應該刪除所有不必要的計算,並且速度要快得多:
var arr = [];
var maxQty=0;
var wantedAverage = 0;
for (var j = 0; j < 11; j++) {
arr[j]=0;
}
for (var j = 0; j < myArray.length; j++) {
var stepIndex = Math.floor((myArray[j]-minValue)/step)
arr[stepIndex]+=1;
if(arr[stepIndex] > maxQty ){
wantedAverage = minValue + stepIndex*step +Math.round(0.5*step);
maxQty = arr[stepIndex]
}
}
console.log(maxQty, wantedAverage)
我們只對數組的每個元素進行一次迭代,然后計算它所屬的窗口的索引,將一個添加到數量數組。 然后,如果我們在窗口中發現了更多的點,我們將更新wantedAverage
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.