贪心算法☞磁盘文件最优存储问题
2016-04-24 22:11
288 查看
------------------------------------------------------------Sun---------------------------------------------------------------------------
问题描述:
设磁盘上有n个文件,f1,f2,…,fn,,每个文件占磁盘上1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且p1+p2+…+pn =1。磁头从当前磁道移到被检信息磁道所需的时间可用这2个磁道之间的径向距离来度量。如果文件pi存放在第i道上,1<i<n ,则检索这n 个文件的期望时间是 ∑【Pi*Pj*d(i,j)】 ,其中 d(i,j)是第i道与第j 道之间的径向距离|i-j|。
磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int A[SIZE]; //存储输入的检索概率
int B[SIZE]; //存储修改过顺序的检索概率
void sort(int A[],int n);
float greedy(int A[],int n);
int main()
{
int i ,n;
printf("请输入文件个数:\n");
scanf("%d",&n);
printf("请输入检索概率\n");
for(i = 0;i < n;i++){
scanf("%d",&A[i]);
}
printf("最小期望检索时间为:%f",greedy(A,n));
return 0;
}
void sort(int A[],int n)
{
int i,j,temp;
for(i = 0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(A[i] > A[j])
{
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
}
float greedy(int A[],int n)
{
double sum = 0,t = 0;
int i,j,k = (n-1)/2;
B[k] = A[n-1]; //B数组中间数存储最大的检索概率 B[2] = A[4]
sort(A,n);
for(i = k+1;i < n;i++)
{
B[i] = A[n-2*(i-k)]; //B[3]= A[3] B[4] = A[1]
}
for(i = k-1;i >= 0;i--)
{
B[i] = A[n-2*(k-i)-1]; //B[1] = A[2] B[0] = A[0]
}
for (i = 0;i < n;i++)
{
sum += A[i];
for(j = i+1; j < n;j++)
t += B[i]*B[j]*(j-i);
}
return t/sum/sum;
}
问题描述:
设磁盘上有n个文件,f1,f2,…,fn,,每个文件占磁盘上1个磁道。这n个文件的检索概率分别是p1,p2,…,pn,且p1+p2+…+pn =1。磁头从当前磁道移到被检信息磁道所需的时间可用这2个磁道之间的径向距离来度量。如果文件pi存放在第i道上,1<i<n ,则检索这n 个文件的期望时间是 ∑【Pi*Pj*d(i,j)】 ,其中 d(i,j)是第i道与第j 道之间的径向距离|i-j|。
磁盘文件的最优存储问题要求确定这n个文件在磁盘上的存储位置,使期望检索时间达到最小。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int A[SIZE]; //存储输入的检索概率
int B[SIZE]; //存储修改过顺序的检索概率
void sort(int A[],int n);
float greedy(int A[],int n);
int main()
{
int i ,n;
printf("请输入文件个数:\n");
scanf("%d",&n);
printf("请输入检索概率\n");
for(i = 0;i < n;i++){
scanf("%d",&A[i]);
}
printf("最小期望检索时间为:%f",greedy(A,n));
return 0;
}
void sort(int A[],int n)
{
int i,j,temp;
for(i = 0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(A[i] > A[j])
{
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
}
float greedy(int A[],int n)
{
double sum = 0,t = 0;
int i,j,k = (n-1)/2;
B[k] = A[n-1]; //B数组中间数存储最大的检索概率 B[2] = A[4]
sort(A,n);
for(i = k+1;i < n;i++)
{
B[i] = A[n-2*(i-k)]; //B[3]= A[3] B[4] = A[1]
}
for(i = k-1;i >= 0;i--)
{
B[i] = A[n-2*(k-i)-1]; //B[1] = A[2] B[0] = A[0]
}
for (i = 0;i < n;i++)
{
sum += A[i];
for(j = i+1; j < n;j++)
t += B[i]*B[j]*(j-i);
}
return t/sum/sum;
}
相关文章推荐
- 逻辑卷管理(LVM) Linux 用户指南
- Tomcat端口被占用解决方法(不用重启)
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- “传奇”图象数据存储方式
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
- C#实现的算24点游戏算法实例分析
- 磁盘已满造成的mysql启动失败问题分享
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法