随机生成100w正负整数存储下来,记录时间t1;然后把这100w数据中的负数全去掉,记录时间t2;

375 阅读1分钟

image.png

运行结果:

image.png

总结:

1、for、 forEach、 map 循环效率依次递增;

2、使用数据 filter 效率最高;

3、二分法收到随机数波动影响,偶尔会超过filter 过滤; 

代码如下:

 * 生成单个正负整数
 * @returns 
 */
const makeOneRandomNum = () => {
    const random = Math.random();
    const plusOrMinus = random < 0.5 ? -random : random;
    return parseInt(plusOrMinus * 10000);
}

/**
 * 生成任意多个随机正负整数
 * @param {*} count 
 * @returns 
 */
const makeAnyRandomNum = (count = 10) => {
    const list = [];
    for (let i = 0; i < count; i++) {
        list.push(makeOneRandomNum());
    }
    return list;
}

/**
 * 普通for循环遍历去除
 * @param {*} numbers 
 */
const removeMinusNumbers1 = (numbers) => {
    const numbersCopy = [...numbers];
    for (let i = 0; i < numbers.length; i++) {
        if (numbers[i] < 0) {
            const index = numbersCopy.findIndex(d => d === numbers[i])
            numbersCopy.splice(index, 1)
        }
    }
    return numbersCopy
}

/**
 * 普通forEach循环遍历去除
 * @param {*} numbers 
 */
const removeMinusNumbers2 = (numbers) => {
    const numbersCopy = [...numbers];
    numbers.forEach(item => {
        if (item < 0) {
            const index = numbersCopy.findIndex(d => d === item)
            numbersCopy.splice(index, 1)
        }
    })
    return numbersCopy;
}

/**
 * 普通map循环遍历去除
 * @param {*} numbers 
 */
const removeMinusNumbers3 = (numbers) => {
    const numbersCopy = [...numbers];
    numbers.map(item => {
        if (item < 0) {
            const index = numbersCopy.findIndex(d => d === item)
            numbersCopy.splice(index, 1)
        }
    })
    return numbersCopy;
}

/**
 * filter过滤去除
 * @param {*} numbers 
 */
const removeMinusNumbers4 = (numbers) => {
    return numbers.filter(item => item > 0);
}

/**
 * 排序二分法 去除
 * @param {*} numbers 
 */
const removeMinusNumbers5 = (numbers) => {
    // 排序后负数在前面 [-99, -45, -3, 0, 1, 44]
    const sortList = numbers.sort();
    // 取数组中间index
    let middleIndex = Math.floor(sortList.length / 2)
    if (sortList[middleIndex] > 0) {
        // middleIndex 左侧还有正数, 需要 (middleIndex --) 向左找到正负分界点
        while (sortList[middleIndex] > 0) {
            middleIndex --;
        }
    } else {
        // middleIndex 右侧还有负数, 需要( middleIndex ++ ) 向右找到正负分界点
        while (sortList[middleIndex] < 0) {
            middleIndex ++;
        }
        middleIndex -= 1
    }
    return sortList.slice(middleIndex+1)
}

const main = () => {
    console.time('生成100w正负随机整数耗时');
    const randomNumList = makeAnyRandomNum(1000000);
    console.timeEnd('生成100w正负随机整数耗时');

    console.log('------------------------------------------------')

    console.time('去除负数---for循环---耗时');
    const result1 = removeMinusNumbers1(randomNumList)
    console.timeEnd('去除负数---for循环---耗时');

    console.log('------------------------------------------------')

    console.time('去除负数---forEach---耗时');
    const result2 = removeMinusNumbers2(randomNumList)
    console.timeEnd('去除负数---forEach---耗时');

    console.log('------------------------------------------------')

    console.time('去除负数---map---耗时');
    const result3 = removeMinusNumbers3(randomNumList)
    console.timeEnd('去除负数---map---耗时');

    console.log('------------------------------------------------')

    console.time('去除负数---filter---耗时');
    const result4 = removeMinusNumbers4(randomNumList)
    console.timeEnd('去除负数---filter---耗时');

    console.log('------------------------------------------------')

    console.time('去除负数---排序二分法---耗时');
    const result7 = removeMinusNumbers5(randomNumList)
    console.timeEnd('去除负数---排序二分法---耗时');

    console.log('------------------------------------------------')

    // console.log('result1:', result1);
    // console.log('result2:', result2);
    // console.log('result3:', result3);
    // console.log('result4:', result4);
    // console.log('result5:', result5);

}

main();