精华内容
下载资源
问答
  • 电梯算法

    2021-04-19 16:58:24
    循环扫描算法(CSCAN),也就是俗称的电梯算法,这种算法就像电梯一样,只能从1楼上到8楼,然后再从8楼下到1楼。

    循环扫描算法(CSCAN),也就是俗称的电梯算法,这种算法就像电梯一样,只能从1楼上到8楼,然后再从8楼下到1楼。

    展开全文
  • 电梯算法 1

    2019-01-09 19:10:44
    电梯算法 1
                   

    电梯算法(1)

    刺猬@http://blog.csdn.net/littlehedgehog

     







    电梯算法主要用于磁盘寻道的优化。

    第一种是我们最为原始的先到先服务(first come first served)的算法,这个对于我们去下馆子撮一顿比较合适,先来就先吃,不然顾客有意见。不过对于磁盘寻道就不太合适了。如下图:

    注意这张图并不是解释的先到先服务算法,我们只是借用下而已 :)

    假设此时我们正在第11道读取数据,然后陆陆续续有其他进程来要求我们提供磁盘内容给他们。这里我们把要读取的柱面(如果你并不是研究磁盘寻道,那么这个词你可以理解为数据块,就是上面的小方块)按照进程提出要求的顺序记录下来的是1, 36, 16, 34, 9, 12,那么严格按照先到先服务原则,我们下一个要去的柱面是1号,中间要经历10个柱面,然后是36号....... 等全部读下来,我们统计下,一共要"跑过"111个柱面。

    很明显的,这个算法效率太低,我们要来改善下算法。

    第二种是最短寻道算法(shortest seek first) 

    这种算法有点类似贪心,即是每次我们选择距离我们现在所处的点最近的一个点(柱面)。如下图,若当前我们正好执行完对于11号块的读取,下一个最近的是12号块,那么我们读取12号块的数据,接着读取16号块...... 我们看到如果用这种算法的话,我们经过的方块号码  12, 9, 16, 1, 34, 36 这样我们总共的经历的柱面数为 61块,这样我们大大节省了寻道时间。

     

    这个算法本来已经很好了,不过我们不得不面临这样一个问题: 现在我们正在读取16号块,马上要读取1号块了,这是一个进程闯进来要求我们为他提供20号块的信息,20号距离16号比较近,那我们就去二十号吧,然后我们又接到通知要23号数据.....这样一直做下去,呃,1号信息呢?天晓得要等到什么时候去读取它内容!

    所以这里我们需要一种算法来平衡效率和公平性(我们也不希望歧视了1号小方块)。所以我们引进了电梯算法 。我们需要做一个标记,标记现在是向数字大的方向读,还是方向小的。如果现在是向前(数字大)读,那么我们就需要一直读下去,一直到最尾一个。同理向后读。这个算法如下图所示:

     




    内容参考《操作系统设计与实现》

     

    第一次写博客全部自己手打出来

    为家乡地震中受苦的人们祈福

    独在异乡为异客




               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 电梯算法的实现

    2013-12-04 11:32:45
    电梯算法的实现,模拟电梯运行,求每个人的出电梯时间
  • 磁盘调度 电梯算法 scan 电梯算法 scan CPP源代码 原创
  • 电梯算法

    千次阅读 2016-11-08 09:46:18
    电梯算法题:  高志大厦因等电梯人数太多,现规定电梯上升只能停一层,大家下电梯再各个步行到自己楼层,求停哪一层所有人步行层数总和最少。input: int[] floorPersonCount = [ 0, 0, 2, 5, 3, 0 ]; //各楼层...

    电梯算法题:

      高志大厦因等电梯人数太多,现规定电梯上升只能停一层,大家下电梯再各个步行到自己楼层,求停哪一层所有人步行层数总和最少。

    input:
        int[] floorPersonCount = [ 0, 0, 2, 5, 3, 0 ];   //各楼层工作的人数统计数组
    ouput:
        int bestFloor;            //求出停留在哪一层,大家走楼梯总数最少

    解析

      这道题目是我们公司内部有人放到wiki上面去的,看到了很多解答,但是都不怎么好理解,现在将我的想法写出来大家参考下。其实此问题可以转化成树的平衡问题,具体做法看以下示例:
    假设电梯只停1至N层,N>1,且第一层的人不需要坐电梯。再假设高志大厦只有5层,每层人数:[0 , 1 , 2 , 3 , 4]; 那么初始状态(电梯在第一层)时可以用下图表示(可以理解为只有左子树的二叉树):
        这里写图片描述

      其中根节点表示电梯停在的楼层,结点的深度表示走到目的楼层所要步行的楼层数,结点的值表示人数。所以这时假如电梯只停在楼层1,那么需要走的楼层数总和:

        0*0 + 1*1 + 2*2 + 3*3 +4*4 = 30

    此时我们做一些定义:
    val表示结点的值,deep表示结点的深度,结点的权重定义为val*deep,子树的权重定义为子树中所有非根子结点权重之和。
    那么对于上图:

        左子树权重:1*1 + 2*2 + 3*3 +4*4 = 30
        右子树权重:0
        权重差:30

    此时我们对上图进行右旋转(切换电梯停止的楼层):
        这里写图片描述
    那么:

        左子树权重:2*1 + 3*2 +4*3 = 20
        右子树权重: 0
        权重差:20

    再次旋转:

        这里写图片描述

        左子树权重:3*1+4*2 = 11
        右子树权重:1
        权重差:10

        这里写图片描述

        左子树权重:4
        右子树权重:2*1+1*2 = 4
        权重差:0

      仔细观察会发现,左子树权重+右子树权重=需要走的总楼层数。在旋转的过程中,左子树权重在逐渐变小,右子树的权重在逐渐增大,我们要找的其实是这颗树的最佳平衡点,即左子树权重和右子树权重差的绝对值最小的时候,这棵树会达到最佳平衡状态。所以思路很明显就出来了。对于此实例显然电梯停止在第4层这棵树达到了最佳平衡状态(此时左右子树权重差最小,为0)。此时需要走的总楼层数为 4+4 = 8。

    代码

    package com.test.elevator.fast;
    
    /**
     * 基于数组的电梯算法
     * 
     * <p>
     * Created by chengli on 2016/11/7.
     */
    public class NewElevator {
        private static int[] a = {0, 1, 2, 3, 4};
        //private static int[] a = {4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8};
    
        public static void main(String[] args) {
            a[0] = 0; /*第一层的人不需要坐电梯*/
            int maxRotateNum = a.length;
            int[] result = new int[maxRotateNum];
            for (int i = 0; i < maxRotateNum; i++) {
                int leftW = leftWeight(i + 1);
                int rightW = rightWeight(i + 1);
                result[i] = Math.abs(leftW - rightW);
            }
            //TODO 找出result数组中值最小的元素,下标i+1即为最佳停止楼层数,。实际上这里可以做很多优化
            //以下只做简单输出,权重最小的即为电梯最佳停放楼层。注意最佳楼层可能不止一个。
            for (int i = 0; i < result.length; i++) {
                System.out.println(String.format("楼层: %s , 权重差: %s", i + 1, result[i]));
            }
        }
    
        /**
         * @param rootIndex 电梯停止层数
         * @return 左子树权重
         * 这里每次循环都要重新计算一次,实际上可以做一些优化以提升效率,具体实现这里就不列出了。
         */
        private static int leftWeight(int rootIndex) {
            int weight = 0;
            for (int i = 0; i < rootIndex - 1; i++) {
                weight += a[i] * (rootIndex - i - 1);
            }
            return weight;
        }
    
        /**
         * 计算右子树权重,原理同上
         */
        private static int rightWeight(int rootIndex) {
            int weight = 0;
            for (int i = rootIndex; i < a.length; i++) {
                weight += a[i] * (i - rootIndex + 1);
            }
            return weight;
        }
    }
    
    展开全文
  • 电梯算法实现

    2008-07-31 03:08:26
    这是一个电梯算法的实现,有两部电梯,六层楼,以VC++6.0实现
  • 首先放一张各个算法全程即缩写对应关系: 其中最容易搞混的就是SCAN算法、电梯算法、和LOOK算法。...SCAN:又称为电梯算法 电梯算法和SCAN都是要到头的!! 电梯算法或者说SCAN算法,需要使用软件来

    首先放一张各个算法全程即缩写对应关系:


    其中最容易搞混的就是SCAN算法、电梯算法、和LOOK算法。SCAN算法又名电梯算法,与LOOK算法不同

    下面我们举个例子,来看一下各个算法的不同之处:


    FCFS:先来先服务



    SSTF:最短寻道时间优先


    SCAN:又称为电梯算法 电梯算法和SCAN都是要到头的!!

    电梯算法或者说SCAN算法,需要使用软件来维护一个标志位,标志当前磁盘是向高处移动还是低处。磁盘在移动的过程中,访问在该过程中可以访问到的请求。

    到达边缘以后,反方向继续移动


    C-SCAN:环形SCAN

    和SCAN不同的是,C-SCAN在到头以后,直接跳转到另外一端,然后沿之前的方向继续移动,注意,从一端移动到另一端的时间也算在开销之中


    LOOK:


    改进SCAN算法,不在移动到头,而是在最后的请求处改变方向

    C-LOOK:环形LOOK



    展开全文
  • 磁盘调度中的SCAN算法(即电梯算法)模拟代码,C语言编写 有流程图,代码运行通过
  • Linux0.11中的电梯算法

    2010-04-02 17:45:07
    关于Linux 0.11中使用的电梯算法的思考
  • 用C#实现的操作系统实验之磁盘调度算法,采用的是电梯算法
  • 操作系统的课程设计,先来先服务算法和电梯算法的实现,只有源程序,C++

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,997
精华内容 5,198
关键字:

电梯算法