Almacenamiento óptimo en cintas

Dados  norte   los programas almacenados en una cinta de computadora y la longitud de cada programa  i   es  L_i   donde  1<=i<=n   , encuentre el orden en el que los programas deben almacenarse en la cinta para el cual  \frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{i} L_j   se minimiza el tiempo medio de recuperación (MRT dado como ).
Ejemplo: 
 

Input : n = 3
        L[] = { 5, 3, 10 }
Output : Order should be { 3, 5, 10 } with MRT = 29/3

Prerrequisitos: Almacenamiento de datos en cintas magnéticas 
 

Primero analicemos el problema y comprendamos lo que se debe hacer.
Una cinta magnética solo proporciona acceso secuencial a los datos. En una cinta/cassette de audio, a diferencia de un CD, una quinta canción de la cinta no se puede reproducir directamente. Se debe recorrer la duración de las primeras cuatro canciones para reproducir la quinta canción. Entonces, para acceder a ciertos datos, la cabeza de la cinta debe colocarse en consecuencia.
Ahora supongamos que hay 4 canciones en una cinta de duración de audio de 5, 7, 3 y 2 minutos respectivamente. Para reproducir la cuarta canción, necesitamos atravesar una longitud de audio de 5 + 7 + 3 = 15 minutos y luego colocar el cabezal de la cinta. 
El tiempo de recuperación de los datos es el tiempo necesario para recuperar/acceder a esos datos en su totalidad. Por lo tanto, el tiempo de recuperación de la cuarta canción es 15 + 2 = 17 minutos.
Ahora, considerando que todos los programas en una cinta magnética se recuperan con la misma frecuencia y el cabezal de la cinta apunta hacia el frente de la cinta cada vez, se puede definir un nuevo término llamado Tiempo medio de recuperación (MRT).
Supongamos que el tiempo de recuperación del programa  i   es  T_i   . Por lo tanto,  T_i = \sum_{j=1}^{i} L_j
MRT es el promedio de todos esos  T_i   . Por lo tanto  MRT = \frac{1}{n} \sum_{i=1}^{n} T_i   , o  MRT = \frac{1}{n} \sum_{i=1}^{n} \sum_{j=1}^{i} L_j
El acceso secuencial de datos en una cinta tiene algunas limitaciones. Debe definirse el orden en el que se almacenan los datos/programas en una cinta para que se pueda obtener la menor cantidad de MRT. Por lo tanto, el orden de almacenamiento se vuelve muy importante para reducir el tiempo de acceso/recuperación de datos. 
Por lo tanto, la tarea se reduce: definir el orden correcto y, por lo tanto, minimizar el MRT, es decir, minimizar el término \sum_{i=1}^{n} \sum_{j=1}^{i} L_i
Por ejemplo, supongamos que hay 3 programas de longitudes 2, 5 y 4 respectivamente. ¡Así que hay un total de 3! = 6 posibles órdenes de almacenamiento.
 

  Ordenar Tiempo total de recuperación Tiempo medio de recuperación
1 1 2 3 2 + (2 + 5) + (2 + 5 + 4) = 20 20/3
2 1 3 2 2 + (2 + 4) + (2 + 4 + 5) = 19 19/3
3 2 1 3 5 + (5 + 2) + (5 + 2 + 4) = 23 23/3
4 2 3 1 5 + (5 + 4) + (5 + 4 + 2) = 25 25/3
5 3 1 2 4 + (4 + 2) + (4 + 2 + 5) = 21 21/3
6 3 2 1 4 + (4 + 5) + (4 + 5 + 2) = 24 24/3

Está claro que siguiendo el segundo orden en el almacenamiento de los programas, el tiempo medio de recuperación es mínimo.
En el ejemplo anterior, la duración del primer programa se suma ‘n’ veces, la del segundo ‘n-1’ veces… y así sucesivamente hasta que el último programa se agrega solo una vez. Por lo tanto, un análisis cuidadoso sugiere que para minimizar el MRT, los programas que tienen una mayor duración deben colocarse hacia el final para que la suma se reduzca. O bien, la duración de los programas debe clasificarse en orden creciente. Ese es el Algoritmo Greedy en uso: en cada paso, tomamos la decisión inmediata de poner primero el programa que tiene menos tiempo, para construir la solución optimizada final al problema pieza por pieza.
A continuación se muestra la implementación: 
 

C++

// CPP Program to find the order
// of programs for which MRT is
// minimized
#include <bits/stdc++.h>
 
using namespace std;
 
// This functions outputs the required
// order and Minimum Retrieval Time
void findOrderMRT(int L[], int n)
{
    // Here length of i'th program is L[i]
    sort(L, L + n);
 
    // Lengths of programs sorted according to increasing
    // lengths. This is the order in which the programs
    // have to be stored on tape for minimum MRT
    cout << "Optimal order in which programs are to be"
            "stored is: ";
    for (int i = 0; i < n; i++)
        cout << L[i] << " ";
    cout << endl;
 
    // MRT - Minimum Retrieval Time
    double MRT = 0;
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = 0; j <= i; j++)
            sum += L[j];
        MRT += sum;
    }
    MRT /= n;
    cout << "Minimum Retrieval Time of this"
           " order is " << MRT;
}
 
// Driver Code to test above function
int main()
{
    int L[] = { 2, 5, 4 };
    int n = sizeof(L) / sizeof(L[0]);
    findOrderMRT(L, n);
    return 0;
}

Java

// Java Program to find the order
// of programs for which MRT is
// minimized
import java.io.*;
import java .util.*;
 
class GFG
{
 
// This functions outputs
// the required order and
// Minimum Retrieval Time
static void findOrderMRT(int []L,
                         int n)
{
    // Here length of
    // i'th program is L[i]
    Arrays.sort(L);
 
    // Lengths of programs sorted
    // according to increasing lengths.
    // This is the order in which
    // the programs have to be stored
    // on tape for minimum MRT
    System.out.print("Optimal order in which " +
              "programs are to be stored is: ");
    for (int i = 0; i < n; i++)
        System.out.print(L[i] + " ");
        System.out.println();
 
    // MRT - Minimum Retrieval Time
    double MRT = 0;
    for (int i = 0; i < n; i++)
    {
        int sum = 0;
        for (int j = 0; j <= i; j++)
            sum += L[j];
        MRT += sum;
    }
    MRT /= n;
    System.out.print( "Minimum Retrieval Time" +
                    " of this order is " + MRT);
}
 
// Driver Code
public static void main (String[] args)
{
    int []L = { 2, 5, 4 };
    int n = L.length;
    findOrderMRT(L, n);
}
}
 
// This code is contributed
// by anuj_67.

Python3

# Python program to find the order of programs for which MRT is minimized
 
# This function outputs the required order and Minimum Retrieval Time
def findOrderMRT(L, n):
 
        # Here length of i'th program is L[i]
    L.sort()
 
    # Lengths of programs sorted according to increasing lengths.
    # This is the order in which the programs have to be stored on tape for minimum MRT
    print("Optimal order in which programs are to be stored is:", end=" ")
    for i in range(0, n):
        print(L[i], end=" ")
    print()
 
    # MRT - Minimum Retrieval Time
    MRT = 0
    for i in range(0, n):
        sum = 0
        for j in range(0, i+1):
            sum += L[j]
        MRT += sum
 
    MRT /= n
    print("Minimum Retrieval Time of this order is", "{0:.5f}".format(MRT))
 
 
L = [2, 5, 4]
n = len(L)
findOrderMRT(L, n)
 
# This code is contributed by lokesh (lokeshmvs21).

C#

// C# Program to find the
// order of programs for
// which MRT is minimized
using System;
 
class GFG
{
 
// This functions outputs
// the required order and
// Minimum Retrieval Time
static void findOrderMRT(int []L,
                         int n)
{
    // Here length of
    // i'th program is L[i]
    Array.Sort(L);
 
    // Lengths of programs sorted
    // according to increasing lengths.
    // This is the order in which
    // the programs have to be stored
    // on tape for minimum MRT
    Console.Write("Optimal order in " +  
                  "which programs are" +
                  " to be stored is: ");
    for (int i = 0; i < n; i++)
        Console.Write(L[i] + " ");
        Console.WriteLine();
 
    // MRT - Minimum Retrieval Time
    double MRT = 0;
    for (int i = 0; i < n; i++)
    {
        int sum = 0;
        for (int j = 0; j <= i; j++)
            sum += L[j];
        MRT += sum;
    }
    MRT /= n;
    Console.WriteLine("Minimum Retrieval " +
                  "Time of this order is " +
                                       MRT);
}
 
// Driver Code
public static void Main ()
{
    int []L = { 2, 5, 4 };
    int n = L.Length;
    findOrderMRT(L, n);
}
}
 
// This code is contributed
// by anuj_67.

Javascript

<script>
 
// Javascript Program to find the order
// of programs for which MRT is
// minimized
   
// This functions outputs
// the required order and
// Minimum Retrieval Time
function findOrderMRT(L, n)
{
    // Here length of
    // i'th program is L[i]
    L.sort();
   
    // Lengths of programs sorted
    // according to increasing lengths.
    // This is the order in which
    // the programs have to be stored
    // on tape for minimum MRT
   document.write("Optimal order in which " +
              "programs are to be stored is: ");
    for (let i = 0; i < n; i++)
        document.write(L[i] + " ");
        document.write("<br/>");
   
    // MRT - Minimum Retrieval Time
    let MRT = 0;
    for (let i = 0; i < n; i++)
    {
        let sum = 0;
        for (let j = 0; j <= i; j++)
            sum += L[j];
        MRT += sum;
    }
    MRT /= n;
   document.write( "Minimum Retrieval Time" +
                    " of this order is " + MRT);
}
 
// driver code
 
     let L = [ 2, 5, 4 ];
    let n = L.length;
    findOrderMRT(L, n);
     
</script>

Producción: 
 

Optimal order in which programs are to be stored are: 2 4 5 
Minimum Retrieval Time of this order is 6.33333

La complejidad de tiempo del programa anterior es la complejidad de tiempo para la clasificación, es decir  O(n largo)   (ya que std::sort() opera en  O(n largo)   ) Si usa la clasificación de burbujas en lugar de std::sort(), tomará  O(n^2)
Puede pensar que la complejidad de tiempo para este código anterior en particular debe deberse a ambos bucles en el cálculo de ‘mrt’, es decir, O(n^2)   pero recuerde que intuitivamente, los bucles for utilizados también se pueden codificar de esta manera para evitar dos bucles: 
 

for (int i = 0; i < n; i++)
    MRT += (n - i) * L[i];

Publicación traducida automáticamente

Artículo escrito por Sagnik Chaudhuri y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *