双核处理器并行处理任务的最短时间算法?

发布于 2022-09-06 10:47:43 字数 1634 浏览 12 评论 0

双核处理器可以并行处理任务,它们的处理速度都为1k/s,每个任务以k为单位,如[300, 600, 300, 500, 1000, 700, 300],求一堆任务的最短时间算法?

下面是我自己用JavaScript写的一个算法,还是有点问题,问下有好的方法吗?

    let arr = [300, 600, 300, 500, 1000, 700, 300];
    let left = [];
    let right = [];
    let lefts = 0;
    let rights = 0;
    let flag = true; // 第一次累加最大值 第二次累加最小值 平分两组任务
    function task(arr) {
        // 平分两组任务
        let newArr = arr.sort((a, b) => b - a);
        if (flag) {
            left.push(newArr[0]);
            right.push(newArr[1]);
            newArr = newArr.slice(2);
        } else {
            left.push(newArr[newArr.length - 1]);
            right.push(newArr[newArr.length - 2]);
            newArr = newArr.slice(0, newArr.length - 2);
        }
        // 开关循环 第一次加最大值 第二次加最小值 依次累加
        flag = !flag; 
        // 两组任务分别之和
        lefts = left.reduce((a, b) => a + b);
        rights = right.reduce((a, b) => a + b);
        // 只剩下一个任务或0个任务时,最终结果计算
        if (newArr.length <= 1) {
            if (newArr.length == 1) {
                if ((lefts - rights) > newArr[0]) {
                    return lefts;
                } else {
                    right.push(newArr[0]);
                    rights = right.reduce((a, b) => a + b);
                    return rights;
                }
            } else {
                if (lefts < rights) {
                    return rights;
                } else {
                    return lefts;
                }
            }
        }
        // 递归调用实现循环
        return task(newArr);
    };
    console.log("最短输出时间为:" + task(arr) + 's');

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只等公子 2022-09-13 10:47:43

是NP-hard问题。近似算法参见partition problem

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文