87,917
社区成员
发帖
与我相关
我的任务
分享
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}个点,共耗时上述毫秒值。`)
const generateRandomData = (total = 4000, max = 200, min = 10) => { //随机生成长度为total的数组,数组中每个数字为min到max之间
const arr = []
console.time('generateRandomData')
let i = 0
while(total > i){
arr[i++] = (min + ~~(Math.random() * (max - min + 1)))
}
console.timeEnd('generateRandomData')
return arr
}
const getThreeValDataByCompleteData = (data, step = 20) => {
// const stepData = []
const myarr = []
let arr = []
for(let i = 0; i < data.length; i += step){
// stepData.push(data.slice(i, i + step))
arr = data.slice(i, i + step)
const max = Math.max(...arr),
min = Math.min(...arr),
age = (max - min) / 2 + min,
complete = []
let diff = age
middle = diff,
index = 0,
count = 0
for(let k = 0; k < arr.length; k++){
count = Math.abs(arr[k] - age)
if(max == arr[k]){
complete[k] = max
}else if(min == arr[k]){
complete[k] = min
}else if(diff > count){
diff = count
middle = arr[k]
index = k
}
}
complete[index] = middle
myarr.push(...Array.from(new Set(complete)).filter(item => item != undefined))
}
return myarr
}
let interval = 20 //每多少个点生成间隔数组
let data = generateRandomData(300000,interval) //随机生成长度为30万的数组,数组中每个数字为10到200之间
console.time('time')
let res = getThreeValDataByCompleteData(data, interval) //通过函数获取4.5万满足需求的点
console.timeEnd('time')
console.log(`随机生成${data.length}个点,以${interval}个点作为间隔数组,每个间隔数组按顺序得到最小值,最大值,平均值这三个点(顺序按照3个值实际在数组中的顺序),最后生成${res.length}个点,共耗时上述毫秒值。`)
const generateRandomData = (total = 4000, max = 200, min = 10) => { //随机生成长度为total的数组,数组中每个数字为min到max之间
const arr = []
let i = 0
while(total > i){
arr[i++] = (min + ~~(Math.random() * (max - min + 1)))
}
return arr
}
const getThreeValDataByCompleteData = (data, step = 20) => {
const stepData = []
const myarr = []
for(let i = 0; i < data.length; i += step){
stepData.push(data.slice(i, i + step))
}
stepData.map(v => {
const max = Math.max(...v)
const min = Math.min(...v)
const age = (max - min) / 2 + min
let diff = age
let middle = diff
let index = 0
const complete = []
for(let k = 0; k < v.length; k++){
const count = Math.abs(v[k] - age)
if(max == v[k]){
complete[k] = max
}else if(min == v[k]){
complete[k] = min
}else if(diff > count){
diff = count
middle = v[k]
index = k
}
}
complete[index] = middle
// const arr = Array.from(new Set(complete)).filter(item => item != undefined)
myarr.push(...Array.from(new Set(complete)).filter(item => item != undefined))
// if(arr.length < 3){
// console.log(v, arr, max, min, age)
// }
// return complete
})
return myarr
}
let interval = 20 //每多少个点生成间隔数组
let data = generateRandomData(300000,interval) //随机生成长度为30万的数组,数组中每个数字为10到200之间
console.time('time')
let res = getThreeValDataByCompleteData(data, interval) //通过函数获取4.5万满足需求的点
console.timeEnd('time')
console.log(`随机生成${data.length}个点,以${interval}个点作为间隔数组,每个间隔数组按顺序得到最小值,最大值,平均值这三个点(顺序按照3个值实际在数组中的顺序),最后生成${res.length}个点,共耗时上述毫秒值。`)
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).forEach((val, idx)=>{
arr.push({val: val, idx: idx}) //用对象直接记住位置(索引)和值信息
})
let arrlen = arr.length
//以值排序,过滤(最小,最大,中值),再以位置(索引)排序,最后去掉索引信息只保留值信息
arr.sort((a,b)=>a.val-b.val)
.filter((val, idx)=>(idx==0||idx==arrlen-1||idx==Math.ceil(arrlen / 2)))
.sort((a,b)=>a.idx-b.idx)
.forEach(e=>{
resArr.push(e.val)
})
}
return resArr
}
//验证样例数据
//let testData = [5,67,34,2,56,123,66,77,88,8,22,187,1,99,88,77,34,2,1,99]
//let testRes = getThreeValDataByCompleteData(testData)
//console.log(testRes)
let interval = 20 //每多少个点生成间隔数组
let data = generateRandomData(300000,interval) //随机生成长度为30万的数组,数组中每个数字为10到200之间
console.time('time')
let res = getThreeValDataByCompleteData(data) //通过函数获取4.5万满足需求的点
console.timeEnd('time')
console.log(`随机生成${data.length}个点,以${interval}个点作为间隔数组,每个间隔数组按顺序得到最小值,最大值,平均值这三个点(顺序按照3个值实际在数组中的顺序),最后生成${res.length}个点,共耗时上述毫秒值。`)
function generateRandomData(){
const arr = []
console.time('generateRandomData')
let i = 0
// 用while循环还能快一点点,可能有时候快个1~2 ms,有时候没区别,感知不强
while(total > i){
arr[i++] = (min + ~~(Math.random() * (max - min + 1)))
}
// for (let i = 0; i < total; i++) {
// arr[i] = (min + ~~(Math.random() * (max - min + 1)))
// }
console.timeEnd('generateRandomData')
return arr
}
const generateRandomData = (total = 4000, max = 200, min = 10) => { //随机生成长度为total的数组,数组中每个数字为min到max之间
const arr = []
console.time('generateRandomData')
for (let i = 0; i < total; i++) {
arr[i] = (min + ~~(Math.random() * (max - min + 1)))
}
console.timeEnd('generateRandomData')
return arr
}
// const getThreeValDataByCompleteData = (data, step = 20) => { //获取满足需求的点的数组
// console.time('getThreeValDataByCompleteData')
// 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)
// }
// console.timeEnd('getThreeValDataByCompleteData')
// return resArr
// }
function getThreeValDataByCompleteData(data, step = 20){
const stepData = []
for(let i = 0; i < data.length; i += 20){
stepData.push(data.slice(i, i + step))
}
console.log(data.length)
const operation = stepData.map(v => {
const max = Math.max(...v)
const min = Math.min(...v)
const age = (max - min) / 2
let diff = (max - min) / 2
let middle = diff
let index = 0
const complete = []
for(let k = 0; k < v.length; k++){
const count = Math.abs(v[k] - age)
if(max == v[k]){
complete[k] = max
}else if(min == v[k]){
complete[k] = min
}else if(diff > count){
diff = count
middle = v[k]
index = k
}
}
complete[index] = middle
return Array.from(new Set(complete)).filter(item => item != undefined)
})
return operation
}
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}个点,共耗时上述毫秒值。`
// )
console.time('my')
const my = getThreeValDataByCompleteData(data, interval)
console.timeEnd('my')
console.log(my)
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 indexArr = [arr.indexOf(max),arr.indexOf(min),arr.indexOf(center)];
indexArr.sort();
indexArr.forEach(e => {
resArr.push(arr[e])
})
}
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}个点,共耗时上述毫秒值。`)
测试 都在40-70ms之间
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}个点,共耗时上述毫秒值。`)