磁盘调度JST中的SSTF

时间:2017-06-26 06:43:05

标签: javascript

我正在编写一个关于磁盘调度的演示 - 在Javascript中使用SSTF 当我运行时,控制台继续运行但很长时间没有显示结果或错误。我想我的代码在某处错了,但我无法弄清楚。 你们能帮助我吗?非常感谢你! 对不起,我的坏Eng!

var arr = [53, 98, 183, 37, 122, 14, 124, 65, 67];

//shortest seek time first
function sstf(arr) {

    var headFirst = arr[0];
    arr.sort(function(a, b) { return a - b });
    var headStart = 0;
    var headMove = 0;

    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == headFirst) {
            headStart = i;
            break;
        }
    }

    while (true) {
        //
        if (headStart === 1 || headStart === arr.length) {
            break;
        }

        //define local a, b which are the distance between the next and the previous of the current index
        if (arr[headStart - 1] === "undefined") {
            a = arr[headStart] - arr[headStart];
        } else {
            a = arr[headStart] - arr[headStart - 1];
        }
        if (arr[headStart + 1] === "undefined") {
            b = arr[headStart] - arr[headStart];
        } else {
            b = arr[headStart + 1] - arr[headStart];
        }

        //compare a & b
        if (a < b) {
            headMove += a;
            var temp = headStart;
            arr.splice(headStart, 1);
            headStart = temp - 1;
        } else if (a > b) {
            headMove += b;
        }
    }

    //check if headStart = at the beginning going forward or at the last going backward
    if (headStart === 1) {
        for (var i = 1; i < arr.length; i++) {
            headMove += Math.abs(arr[i] - arr[i - 1]);
        }
    } else if (headStart === arr.length) {
        for (var i = arr.length - 1; i > 1; i--) {
            headMove += Math.abs(arr[i - 1] - arr[i])
        }
    }

    return headMove;
}
console.log(sstf(arr));

1 个答案:

答案 0 :(得分:0)

请记住,js索引从0开始,而不是1.因此,您必须在代码中将某些“1”更改为“0”。

if (a > b) {
    headMove += b;
}

应该是

if (a > b) {
    headMove += b;
    arr.splice(headStart, 1);
}

删除当前值以在while块开始时正确执行检查。

主要原因是你的代码永远在运行,你不会像我上面所说的那样删除“arr”中的项目。然后headStart仍然卡在某处,“休息”永远不会发生。