双核处理器并行处理任务的最短时间算法?
双核处理器可以并行处理任务,它们的处理速度都为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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是NP-hard问题。近似算法参见partition problem。