4-3 磁带最优存储问题
问题描述
设有 n 个程序{1,2,...,n}{1,2,...,n}要存放在长度为 L 的磁带上。程序 i 存放在磁带上的长度是 lili ,1≤i≤n1≤i≤n。这n个程序的读取概率分别是p1,p2,...,pnp1,p2,...,pn,且∑i=1npi=1∑i=1npi=1。如果将这n个程序按i1,i2,...,ini1,i2,...,in的次序存放,则读取irir所需的时间 tr=c∑k=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

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

被折叠的 条评论
为什么被折叠?



