Requisito previo: Algoritmos de programación de disco
Dada una array de números de pista de disco y la posición inicial de la cabeza, nuestra tarea es encontrar el número total de operaciones de búsqueda realizadas para acceder a todas las pistas solicitadas si se utiliza el algoritmo de programación de disco C-LOOK . Además, escriba un programa para encontrar la secuencia de búsqueda usando el algoritmo de programación de disco C-LOOK .
Algoritmo de programación de disco C-LOOK (LOOK circular):
C-LOOK es una versión mejorada de los algoritmos de programación de disco SCAN y LOOK . Este algoritmo también usa la idea de envolver las pistas como un cilindro circular como el algoritmo C-SCAN pero el tiempo de búsqueda es mejor que el algoritmo C-SCAN. Sabemos que C-SCAN se usa para evitar el hambre y atender todas las requests de manera más uniforme, lo mismo ocurre con C-LOOK.
En este algoritmo, el encabezado atiende las requests solo en una dirección (ya sea hacia la izquierda o hacia la derecha) hasta que no se atienden todas las requests en esta dirección y luego vuelve a la solicitud más lejana en la otra dirección y atiende las requests restantes, lo que brinda un mejor uniforme servicio y evita perder el tiempo de búsqueda para ir hasta el final del disco.
Algoritmo-
- Let Request array representa una array que almacena índices de las pistas que se han solicitado en orden ascendente de su hora de llegada y head es la posición de la cabeza del disco.
- Se da la dirección inicial en la que se mueve la cabeza y sirve en la misma dirección.
- El jefe atiende todas las requests una por una en la dirección en que se mueve.
- El cabezal continúa moviéndose en la misma dirección hasta que se hayan atendido todas las requests en esta dirección.
- Mientras se mueve en esta dirección, calcule la distancia absoluta de las huellas desde la cabeza.
- Incremente el conteo total de búsqueda con esta distancia.
- La posición de la pista actualmente revisada ahora se convierte en la nueva posición principal.
- Vaya al paso 5 hasta que lleguemos a la última solicitud en esta dirección.
- Si llegamos a la última solicitud en la dirección actual, invierta la dirección y mueva el cabezal en esta dirección hasta llegar a la última solicitud que se necesita atender en esta dirección sin atender las requests intermedias.
- Invierta la dirección y vaya al paso 3 hasta que no se hayan atendido todas las requests.
Ejemplos:
Entrada:
Secuencia de solicitud = {176, 79, 34, 60, 92, 11, 41, 114}
Posición inicial del cabezal = 50
Dirección = derecha (moviéndose de izquierda a derecha)
Salida:
Posición inicial del cabezal: 50
Número total de operaciones de búsqueda = 156
La secuencia de búsqueda es
60
79
92
114
176
11
34
41
El siguiente gráfico muestra la secuencia en la que se atienden las pistas solicitadas utilizando C-LOOK.
Por lo tanto, el recuento de búsqueda total = (60 – 50) + (79 – 60) + (92 – 79) + (114 – 92) + (176 – 114) + (176 – 11) + (34 – 11) + ( 41 – 34) = 321
Implementación:
La implementación del algoritmo C-LOOK se proporciona a continuación. Tenga en cuenta que la variable de distancia se utiliza para almacenar la distancia absoluta entre el cabezal y la posición actual de la pista, disk_size es el tamaño del disco. Los vectores izquierdo y derecho almacenan todas las pistas de solicitud en el lado izquierdo y el lado derecho de la posición inicial de la cabeza, respectivamente.
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; int size = 8; int disk_size = 200; // Function to perform C-LOOK on the request // array starting from the given head void CLOOK(int arr[], int head) { int seek_count = 0; int distance, cur_track; vector<int> left, right; vector<int> seek_sequence; // Tracks on the left of the // head will be serviced when // once the head comes back // to the beginning (left end) for (int i = 0; i < size; i++) { if (arr[i] < head) left.push_back(arr[i]); if (arr[i] > head) right.push_back(arr[i]); } // Sorting left and right vectors std::sort(left.begin(), left.end()); std::sort(right.begin(), right.end()); // First service the requests // on the right side of the // head for (int i = 0; i < right.size(); i++) { cur_track = right[i]; // Appending current track to seek sequence seek_sequence.push_back(cur_track); // Calculate absolute distance distance = abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now new head head = cur_track; } // Once reached the right end // jump to the last track that // is needed to be serviced in // left direction seek_count += abs(head - left[0]); head = left[0]; // Now service the requests again // which are left for (int i = 0; i < left.size(); i++) { cur_track = left[i]; // Appending current track to seek sequence seek_sequence.push_back(cur_track); // Calculate absolute distance distance = abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now the new head head = cur_track; } cout << "Total number of seek operations = " << seek_count << endl; cout << "Seek Sequence is" << endl; for (int i = 0; i < seek_sequence.size(); i++) { cout << seek_sequence[i] << endl; } } // Driver code int main() { // Request array int arr[size] = { 176, 79, 34, 60, 92, 11, 41, 114 }; int head = 50; cout << "Initial position of head: " << head << endl; CLOOK(arr, head); return 0; }
Java
// Java implementation of the approach import java.util.*; class GFG{ static int size = 8; static int disk_size = 200; // Function to perform C-LOOK on the request // array starting from the given head public static void CLOOK(int arr[], int head) { int seek_count = 0; int distance, cur_track; Vector<Integer> left = new Vector<Integer>(); Vector<Integer> right = new Vector<Integer>(); Vector<Integer> seek_sequence = new Vector<Integer>(); // Tracks on the left of the // head will be serviced when // once the head comes back // to the beginning (left end) for(int i = 0; i < size; i++) { if (arr[i] < head) left.add(arr[i]); if (arr[i] > head) right.add(arr[i]); } // Sorting left and right vectors Collections.sort(left); Collections.sort(right); // First service the requests // on the right side of the // head for(int i = 0; i < right.size(); i++) { cur_track = right.get(i); // Appending current track // to seek sequence seek_sequence.add(cur_track); // Calculate absolute distance distance = Math.abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now new head head = cur_track; } // Once reached the right end // jump to the last track that // is needed to be serviced in // left direction seek_count += Math.abs(head - left.get(0)); head = left.get(0); // Now service the requests again // which are left for(int i = 0; i < left.size(); i++) { cur_track = left.get(i); // Appending current track to // seek sequence seek_sequence.add(cur_track); // Calculate absolute distance distance = Math.abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now the new head head = cur_track; } System.out.println("Total number of seek " + "operations = " + seek_count); System.out.println("Seek Sequence is"); for(int i = 0; i < seek_sequence.size(); i++) { System.out.println(seek_sequence.get(i)); } } // Driver code public static void main(String []args) { // Request array int arr[] = { 176, 79, 34, 60, 92, 11, 41, 114 }; int head = 50; System.out.println("Initial position of head: " + head); CLOOK(arr, head); } } // This code is contributed by divyesh072019
Python3
# Python3 implementation of the approach size = 8 disk_size = 200 # Function to perform C-LOOK on the request # array starting from the given head def CLOOK(arr, head): seek_count = 0 distance = 0 cur_track = 0 left = [] right = [] seek_sequence = [] # Tracks on the left of the # head will be serviced when # once the head comes back # to the beginning (left end) for i in range(size): if (arr[i] < head): left.append(arr[i]) if (arr[i] > head): right.append(arr[i]) # Sorting left and right vectors left.sort() right.sort() # First service the requests # on the right side of the # head for i in range(len(right)): cur_track = right[i] # Appending current track # seek sequence seek_sequence.append(cur_track) # Calculate absolute distance distance = abs(cur_track - head) # Increase the total count seek_count += distance # Accessed track is now new head head = cur_track # Once reached the right end # jump to the last track that # is needed to be serviced in # left direction seek_count += abs(head - left[0]) head = left[0] # Now service the requests again # which are left for i in range(len(left)): cur_track = left[i] # Appending current track to # seek sequence seek_sequence.append(cur_track) # Calculate absolute distance distance = abs(cur_track - head) # Increase the total count seek_count += distance # Accessed track is now the new head head = cur_track print("Total number of seek operations =", seek_count) print("Seek Sequence is") for i in range(len(seek_sequence)): print(seek_sequence[i]) # Driver code # Request array arr = [ 176, 79, 34, 60, 92, 11, 41, 114 ] head = 50 print("Initial position of head:", head) CLOOK(arr, head) # This code is contributed by rag2127
C#
// C# implementation of the approach using System; using System.Collections.Generic; class GFG{ static int size = 8; // Function to perform C-LOOK on the request // array starting from the given head static void CLOOK(int[] arr, int head) { int seek_count = 0; int distance, cur_track; List<int> left = new List<int>(); List<int> right = new List<int>(); List<int> seek_sequence = new List<int>(); // Tracks on the left of the // head will be serviced when // once the head comes back // to the beginning (left end) for(int i = 0; i < size; i++) { if (arr[i] < head) left.Add(arr[i]); if (arr[i] > head) right.Add(arr[i]); } // Sorting left and right vectors left.Sort(); right.Sort(); // First service the requests // on the right side of the // head for(int i = 0; i < right.Count; i++) { cur_track = right[i]; // Appending current track // to seek sequence seek_sequence.Add(cur_track); // Calculate absolute distance distance = Math.Abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now new head head = cur_track; } // Once reached the right end // jump to the last track that // is needed to be serviced in // left direction seek_count += Math.Abs(head - left[0]); head = left[0]; // Now service the requests again // which are left for(int i = 0; i < left.Count; i++) { cur_track = left[i]; // Appending current track to // seek sequence seek_sequence.Add(cur_track); // Calculate absolute distance distance = Math.Abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now the new head head = cur_track; } Console.WriteLine("Total number of seek " + "operations = " + seek_count); Console.WriteLine("Seek Sequence is"); for(int i = 0; i < seek_sequence.Count; i++) { Console.WriteLine(seek_sequence[i]); } } // Driver code static void Main() { // Request array int[] arr = { 176, 79, 34, 60, 92, 11, 41, 114 }; int head = 50; Console.WriteLine("Initial position of head: " + head); CLOOK(arr, head); } } // This code is contributed by divyeshrabadiya07
Javascript
<script> // Javascript implementation of the approach let size = 8; // Function to perform C-LOOK on the request // array starting from the given head function CLOOK(arr, head) { let seek_count = 0; let distance, cur_track; let left = []; let right = []; let seek_sequence = []; // Tracks on the left of the // head will be serviced when // once the head comes back // to the beginning (left end) for(let i = 0; i < size; i++) { if (arr[i] < head) left.push(arr[i]); if (arr[i] > head) right.push(arr[i]); } // Sorting left and right vectors left.sort(function(a, b){return a - b}); right.sort(function(a, b){return a - b}); // First service the requests // on the right side of the // head for(let i = 0; i < right.length; i++) { cur_track = right[i]; // Appending current track // to seek sequence seek_sequence.push(cur_track); // Calculate absolute distance distance = Math.abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now new head head = cur_track; } // Once reached the right end // jump to the last track that // is needed to be serviced in // left direction seek_count += Math.abs(head - left[0]); head = left[0]; // Now service the requests again // which are left for(let i = 0; i < left.length; i++) { cur_track = left[i]; // Appending current track to // seek sequence seek_sequence.push(cur_track); // Calculate absolute distance distance = Math.abs(cur_track - head); // Increase the total count seek_count += distance; // Accessed track is now the new head head = cur_track; } document.write("Total number of seek " + "operations = " + seek_count + "</br>"); document.write("Seek Sequence is" + "</br>"); for(let i = 0; i < seek_sequence.length; i++) { document.write(seek_sequence[i] + "</br>"); } } // Request array let arr = [ 176, 79, 34, 60, 92, 11, 41, 114 ]; let head = 50; document.write("Initial position of head: " + head + "</br>"); CLOOK(arr, head); </script>
Initial position of head: 50 Total number of seek operations = 321 Seek Sequence is 60 79 92 114 176 11 34 41