贪心算法解磁盘文件最优存储问题——算法解题报告
2008-12-05 21:36
543 查看
设磁盘上有n个文件f1,f2,…,fn,每个文件占用磁盘上的1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且 =1。磁头从当前磁道移到被检信息磁道所需的时间可用这2个磁道之间的径向距离来度量。如果文件fi存放在第i道上,1≦i≦n,则检索这n个文件的期望时间是对于所有的i<j,time+=pi*pj*d(i,j) 。其中d(i,j)是第i道与第j道之间的径向距离|i-j|。
磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。
要求:
输入:第1行是正整数n,表示文件个数。第2行有n个正整数ai,表示文件的检索概率。
输出:计算出的最小期望检索时间。
思路:
先将n个文件按访问概率从大到小排序,概率最大的应该放中间,次大的和次次大的放最大的两边,再小一点的再放在次大的左边和次次大的右边
具体算法:
将文件按概率排序后,用一个新的数组代表各文件存放位置,先确定mid值,再依次确定mid两边,mid两边的两边的各文件,不断的循环,最后各文件就再新的数组里放好了位置
C++代码
#include <stdio.h>
#include <algorithm>
int cmp (const void *a , const void *b) {
return *(double *)a - *(double *)b;
}
double greedy(double a[],int n) {
qsort(a,n,sizeof(double),cmp);
int mid = (n - 1) / 2;
double x
;
x[mid] = a[n-1];
for(int i = mid+1;i < n;i++)
x[i] = a[n - 2*(i-mid)];
for(int i = mid-1;i >= 0;i--)
x[i] = a[n - 2*(mid-i) - 1];
double sum = 0,exp = 0;
for(int i = 0;i < n;i++) {
sum += a[i];
for(int j = i+1;j < n;j++)
exp += x[i]*x[j]*(j-i);
}
return exp/sum/sum;
}
int main() {
int i,j,n;
double a[1000],exp;
scanf("%d",&n);
for(i = 0;i < n;i++)
scanf("%lf",&a[i]);
exp = greedy(a,n);
printf("%lf/n",exp);
}
磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。
要求:
输入:第1行是正整数n,表示文件个数。第2行有n个正整数ai,表示文件的检索概率。
输出:计算出的最小期望检索时间。
思路:
先将n个文件按访问概率从大到小排序,概率最大的应该放中间,次大的和次次大的放最大的两边,再小一点的再放在次大的左边和次次大的右边
具体算法:
将文件按概率排序后,用一个新的数组代表各文件存放位置,先确定mid值,再依次确定mid两边,mid两边的两边的各文件,不断的循环,最后各文件就再新的数组里放好了位置
C++代码
#include <stdio.h>
#include <algorithm>
int cmp (const void *a , const void *b) {
return *(double *)a - *(double *)b;
}
double greedy(double a[],int n) {
qsort(a,n,sizeof(double),cmp);
int mid = (n - 1) / 2;
double x
;
x[mid] = a[n-1];
for(int i = mid+1;i < n;i++)
x[i] = a[n - 2*(i-mid)];
for(int i = mid-1;i >= 0;i--)
x[i] = a[n - 2*(mid-i) - 1];
double sum = 0,exp = 0;
for(int i = 0;i < n;i++) {
sum += a[i];
for(int j = i+1;j < n;j++)
exp += x[i]*x[j]*(j-i);
}
return exp/sum/sum;
}
int main() {
int i,j,n;
double a[1000],exp;
scanf("%d",&n);
for(i = 0;i < n;i++)
scanf("%lf",&a[i]);
exp = greedy(a,n);
printf("%lf/n",exp);
}
相关文章推荐
- 贪心算法作业之磁带最优存储问题与磁盘文件最优存储问题
- 【HDU4313】Matrix 多校 解题报告+AC代码+思路+算法正确性证明,此为Kruskal贪心简单版本,恶心版本稍后放出【目标达成 0.2%】
- 贪心算法——最优装载问题
- COGS 457. 最优布线问题 解题报告
- Wsus问题之存储更新文件的磁盘已满或出现故障
- 贪心算法一:最优装载问题
- 贪心算法之最优装船问题
- 【HDU4313】Matrix 多校 解题报告+AC代码+思路+算法正确性证明,此为Kruskal贪心恶心版本,非自虐倾向慎入!建议想找解题报告的童鞋看简单版本的,这个我写给自己【目标达成 0.2%】
- 磁带最优存储问题(贪婪算法)
- 文件最优存储问题
- 贪心磁盘存储问题
- 贪心算法-4.3最优装载问题
- 贪心算法之最优装载问题
- 【解题报告】最近点对问题 算法设计与分析 分治算法 openjudge
- 贪心算法之最优分解(实验报告版)
- 磁带的最优存储问题(贪心选择)
- 贪心算法解汽车加油问题——算法解题报告
- 0-1背包问题,poj 3624 Charm Bracelet动态规划-解题报告,增加最优路径构建
- POJ - 1700 Crossing River解题报告(过河问题的贪心策略)
- 问题描述如下: 有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数; 另外,可用的内存限定为600M; 要求算法尽量高效,最优;