您的位置:首页 > 其它

贪心算法☞磁盘文件最优存储问题

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息