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

来源:互联网 发布:美工兼职 编辑:程序博客网 时间:2024/05/22 05:10

------------------------------------------------------------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 100int   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;         }


0 0