最优磁盘文件存储问题

2019-05-13  本文已影响0人  彳亍cium

1. 问题描述

  设磁盘上有n个文件f_1,f_2, \cdots,f_n,每个文件占用磁盘上的1个磁道。这n个文件的检索概率分别为p_1,p_2,\cdots,p_n,且\sum_{i=1}^{n}p_i = 1。磁头从当前磁道移到被检索信息磁道所需的时间可用这2个磁道之间的径向距离来衡量。如果文件f_i存放在第i道上,1 \le i \le n,则检索这n的文件的期望时间是\sum_{1 \le i < j \le n}p_ip_jd(i,j)。式中,d(i,j)是第i道与第j道之间的径向距离|i - j|

  磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,是期望检索时间达到最小。试设计一个解此问题的算法,并分析算法的正确性与计算复杂性。

1.1. 算法思想

  利用贪心算法来进行设计,很容易由存储的期望时间\sum_{1 \le i < j \le n}p_ip_jd(i,j)想到应该把概率大的先进行安排且彼此靠的最近,然后再依次安排概率低的。具体的方案如下:先将n个文件按照检索概率从大到小排序,即f_1 \ge f_2 \ge \cdots f_n,然后将检索概率最大的文件放在中间磁道,次大的和第三大的放在最大的两边,第四大的放在次大的右侧,第五大的放在第三大的左侧,依此类推,如题中所给案例,即得到磁盘文件的最优存储位置\cdots f_5,f_3,f_1,f_2,f_4,\cdots

1.2. 核心代码

double greedy(vector<double> data,int n) {
    sort(data.begin(), data.end(), compare);  //降序排序,得到[f1,f2,f3,f4,f5,...,fn]

    vector<double> result(n);

    int mid = (n - 1) / 2;
    result[mid] = data[0];  //按照...,f5,f3,f1,f2,f4,...的方式对磁盘文件进行排列
    for (int i = mid - 1; i >= 0; i--)
        result[i] = data[2 * (mid - i)];
    for (int i = mid + 1; i < n; i++)
        result[i] = data[2 * (i - mid) - 1];
    for (int i = 0; i < n; i++) cout <<  "  " << result[i] << endl;

    double sum = 0;
    double cost = 0;
    for (int i = 0; i < n; i++) {  //计算最小期望检索时间
        sum += result[i];
        for (int j = i + 1; j < n; j++)
            cost += result[i] * result[j] * (j - i);
    }
    return cost / sum / sum;
}

1.3. 结论与算法分析

TIM截图20190513190000.png
上一篇 下一篇

猜你喜欢

热点阅读