需求:
從一個30萬資料量的一個一維陣列中,以20個點為間隔,取20個點中的最大值,最小值,中值,并按原陣列中的順序生成新的3個點(也就是20個點變成3個點);由于以20個點取中值,中間2個值任取1個即可,如果最大值,最小值,中值有相同的,任取一個即可,但要保證取完的3值在原20個點中的前后順序一致;最后生成一個4萬5千資料良的新陣列。
當前代碼耗時大約是550ms之間,希望能優化性能,減少js執行時間;代碼耗時越少,我給的分越高,謝謝大家幫忙。
以20個點為例子:
[5,67,34,2,56,123,66,77,88,8,22,187,1,99,88,77,34,2,1,99] 應該得到 [66,187,1] 或者 [56,187,1] 都可以
當前待優化代碼:
const generateRandomData = (total = 4000, max = 200, min = 10) => { //隨機生成長度為total的陣列,陣列中每個數字為min到max之間
const arr = []
for (let i = 0; i < total; i++) {
arr[i] = min + ~~(Math.random() * (max - min + 1))
}
return arr
}
const getThreeValDataByCompleteData = (data, step = 20) => { //獲取滿足需求的點的陣列
let resArr = []
for (let i = 0; i < data.length; i += step) {
let arr = data.slice(i, i + step),
arrlen = arr.length,
sortArr = arr.concat().sort((a, b) => a - b),
max = sortArr[arrlen - 1],
min = sortArr[0],
center = sortArr[Math.ceil(arrlen / 2)]
let num = 3, n = 0, threeValArr = Array(num)
let maxExist = true, minExist = true, centerExist = true
for (let j = 0; j < arrlen; j++) {
if (arr[j] === max && maxExist) {
maxExist = false
threeValArr[n++] = arr[j]
}
else if (arr[j] === min && minExist) {
minExist = false
threeValArr[n++] = arr[j]
}
else if (arr[j] === center && centerExist) {
centerExist = false
threeValArr[n++] = arr[j]
}
if (n === num) break;
}
resArr = resArr.concat(threeValArr)
}
return resArr
}
let interval = 20 //每多少個點生成間隔陣列
let data = generateRandomData(300000,interval) //隨機生成長度為30萬的陣列,陣列中每個數字為10到200之間
console.time()
let res = getThreeValDataByCompleteData(data) //通過函式獲取4.5萬滿足需求的點
console.timeEnd()
console.log(`隨機生成${data.length}個點,以${interval}個點作為間隔陣列,每個間隔陣列按順序得到最小值,最大值,平均值這三個點(順序按照3個值實際在陣列中的順序),最后生成${res.length}個點,共耗時上述毫秒值。`)
uj5u.com熱心網友回復:
有一行引數interval傳錯了,以下面的代碼為準
let interval = 20 //每多少個點生成間隔陣列
let data = generateRandomData(300000) //隨機生成長度為30萬的陣列,陣列中每個數字為10到200之間
console.time()
let res = getThreeValDataByCompleteData(data,interval) //通過函式獲取4.5萬滿足需求的點
console.timeEnd()
console.log(`隨機生成${data.length}個點,以${interval}個點作為間隔陣列,每個間隔陣列按順序得到最小值,最大值,平均值這三個點(順序按照3個值實際在陣列中的順序),最后生成${res.length}個點,共耗時上述毫秒值。`)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/134179.html
標籤:JavaScript
下一篇:mousedown()左鍵無效
