算法设计与分析: 4-3 磁带最优存储问题

本文探讨了磁带最优存储问题,旨在确定程序在长度为 L 的磁带上的最佳存储顺序,以最小化平均读取时间。通过使用贪心算法,根据程序的读取概率进行排序,可以优化存储方案。文章提供了问题描述,Java 代码实现及输入输出示例,并分析了算法的正确性和计算复杂性。

4-3 磁带最优存储问题


问题描述

设有 n 个程序{1,2,...,n}{1,2,...,n}要存放在长度为 L 的磁带上。程序 i 存放在磁带上的长度是 lili1in1≤i≤n。这n个程序的读取概率分别是p1,p2,...,pnp1,p2,...,pn,且i=1npi=1∑i=1npi=1。如果将这n个程序按i1,i2,...,ini1,i2,...,in的次序存放,则读取irir所需的时间 tr=ck=1rpikliktr=c∑k=1rpiklik。这n个程序的平均读取时间为r=1ntr∑r=1ntr
磁带最优存储问题要求确定这 n 个程序在磁带上的一个存储次序,使平均读取时间达到最小。试设计一个解此问题的算法,并分析算法的正确性和计算复杂性。

对于给定的 n 个程序存放在磁带上的长度和读取概率,编程计算 n 个程序的最优存储方案。

数据输入:
第一行是正整数 n,表示文件个数。接下来的 n 行中, 每行有 2 个正整数 a 和 b,分别表示程序存放在磁带上的长度和读取概率。实际上第 k 个程序的读取概率为ak/i=1naiak/∑i=1nai。对所有输入均假定c=1。


Java

import java.util.Arrays;
import java.util.Scanner;

public class CiDaiZuiYouCunChu {

    private static int[] len,p,t;
    private static int n;

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        while (true){
            n = input.nextInt();

            len = new int[n+1];
            p = new int[n+1];
            t = new int[n+1];

            for(int i=1; i<=n; i++){
                len[i] = input.nextInt();
                p[i] = input.nextInt();
            }

            double result = greedy();

            System.out.println(String.format("%.4f", result));
        }
    }

    private static double greedy(){
        for(int i=1; i<=n; i++)
            t[i] = p[i] * len[i];

        Arrays.sort(t);

        for(int i=2; i<=n; i++)
            t[i] += t[i-1];

        int totalTime = 0;
        double totalP = 0;

        for(int i=1; i<=n; i++){
            totalTime += t[i];
            totalP += p[i];
        }

        return totalTime/totalP;
    }
}

Input & Output

5
71 872
46 452
9 265
73 120
35 85
85.6193

王晓东《计算机算法设计与分析》(第3版)P129

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值