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

————————————————————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;         
}

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/qq_31992913/article/details/51236317
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞