1
+ package Others ;
2
+
3
+ import java .util .Array -List ;
4
+
5
+ /**
6
+ * @author Dekas Dimitrios
7
+ */
8
+ public class BestFit {
9
+ private static final int NO_ALLOCATION = -255 ; // if a process has been allocated in position -255,
10
+ // it means that it has not been actually allocated.
11
+
12
+ /**
13
+ * Method to find the maximum valued element of an array filled with positive integers.
14
+ *
15
+ * @param array: an array filled with positive integers.
16
+ * @return the maximum valued element of the array.
17
+ */
18
+ private static int findMaxElement (int [] array ) {
19
+ int max = -1 ;
20
+ for (int value : array ) {
21
+ if (value > max ) {
22
+ max = value ;
23
+ }
24
+ }
25
+ return max ;
26
+ }
27
+
28
+ /**
29
+ * Method to find the index of the memory block that is going to fit the given process based on the best fit algorithm.
30
+ *
31
+ * @param blocks: the array with the available memory blocks.
32
+ * @param process: the size of the process.
33
+ * @return the index of the block that fits, or -255 if no such block exists.
34
+ */
35
+ private static int findBestFit (int [] blockSizes , int processSize ) {
36
+ // Initialize minDiff with an unreachable value by a difference between a blockSize and the processSize.
37
+ int minDiff = findMaxElement (blockSizes );
38
+ int index = NO_ALLOCATION ; // If there is no block that can fit the process, return NO_ALLOCATION as the result.
39
+ for (int i =0 ; i < blockSizes .length ; i ++) { // Find the most fitting memory block for the given process.
40
+ if (blockSizes [i ] - processSize < minDiff && blockSizes [i ] - processSize >= 0 ) {
41
+ minDiff = blockSizes [i ] - processSize ;
42
+ index = i ;
43
+ }
44
+ }
45
+ return index ;
46
+ }
47
+
48
+ /**
49
+ * Method to allocate memory to blocks according to the best fit
50
+ * algorithm. It should return an ArrayList of Integers, where the
51
+ * index is the process ID (zero-indexed) and the value is the block
52
+ * number (also zero-indexed).
53
+ *
54
+ * @param sizeOfBlocks: an int array that contains the sizes of the memory blocks available.
55
+ * @param sizeOfProcesses: an int array that contains the sizes of the processes we need memory blocks for.
56
+ * @return the ArrayList filled with Integers repressenting the memory allocation that took place.
57
+ */
58
+ static ArrayList <Integer > bestFit (int [] sizeOfBlocks , int [] sizeOfProcesses ) {
59
+ // The array list responsible for saving the memory allocations done by the best-fit algorithm
60
+ ArrayList <Integer > memAlloc = new ArrayList <>();
61
+ // Do this for every process
62
+ for (int processSize : sizeOfProcesses ) {
63
+ int chosenBlockIdx = findBestFit (sizeOfBlocks , processSize ); // Find the index of the memory block going to be used
64
+ memAlloc .add (chosenBlockIdx ); // Store the chosen block index in the memAlloc array list
65
+ if (chosenBlockIdx != NO_ALLOCATION ) { // Only if a block was chosen to store the process in it,
66
+ sizeOfBlocks [chosenBlockIdx ] -= processSize ; // resize the block based on the process size
67
+ }
68
+ }
69
+ return memAlloc ;
70
+ }
71
+
72
+ /**
73
+ * Method to print the memory allocated.
74
+ *
75
+ * @param memAllocation: an ArrayList of Integer representing the memory allocation done by the bestFit method.
76
+ */
77
+ public static void printMemoryAllocation (ArrayList <Integer > memAllocation ) {
78
+ System .out .println ("Process No.\t Block No." );
79
+ System .out .println ("===========\t =========" );
80
+ for (int i = 0 ; i < memAllocation .size (); i ++) {
81
+ System .out .print (" " + i + "\t \t " );
82
+ if (memAllocation .get (i ) != NO_ALLOCATION )
83
+ System .out .print (memAllocation .get (i ));
84
+ else
85
+ System .out .print ("Not Allocated" );
86
+ System .out .println ();
87
+ }
88
+ }
89
+ }
0 commit comments