mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-06 09:06:51 +08:00
Add BandwidthAllocation
algorithm (#5807)
This commit is contained in:
@ -0,0 +1,58 @@
|
||||
package com.thealgorithms.greedyalgorithms;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Class to solve the Bandwidth Allocation Problem.
|
||||
* The goal is to maximize the value gained by allocating bandwidth to users.
|
||||
* Example:
|
||||
* Bandwidth = 10
|
||||
* Users = [3, 5, 7]
|
||||
* Values = [10, 20, 30]
|
||||
* The maximum value achievable is 40 by allocating 3 units to user 0 and 7 units to user 2.
|
||||
*
|
||||
* @author Hardvan
|
||||
*/
|
||||
public final class BandwidthAllocation {
|
||||
private BandwidthAllocation() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocates bandwidth to maximize value.
|
||||
* Steps:
|
||||
* 1. Calculate the ratio of value/demand for each user.
|
||||
* 2. Sort the users in descending order of the ratio.
|
||||
* 3. Allocate bandwidth to users in order of the sorted list.
|
||||
* 4. If the bandwidth is not enough to allocate the full demand of a user, allocate a fraction of the demand.
|
||||
* 5. Return the maximum value achievable.
|
||||
*
|
||||
* @param bandwidth total available bandwidth to allocate
|
||||
* @param users array of user demands
|
||||
* @param values array of values associated with each user's demand
|
||||
* @return the maximum value achievable
|
||||
*/
|
||||
public static int maxValue(int bandwidth, int[] users, int[] values) {
|
||||
int n = users.length;
|
||||
double[][] ratio = new double[n][2]; // {index, ratio}
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
ratio[i][0] = i;
|
||||
ratio[i][1] = (double) values[i] / users[i];
|
||||
}
|
||||
|
||||
Arrays.sort(ratio, (a, b) -> Double.compare(b[1], a[1]));
|
||||
|
||||
int maxValue = 0;
|
||||
for (int i = 0; i < n; i++) {
|
||||
int index = (int) ratio[i][0];
|
||||
if (bandwidth >= users[index]) {
|
||||
maxValue += values[index];
|
||||
bandwidth -= users[index];
|
||||
} else {
|
||||
maxValue += (int) (ratio[i][1] * bandwidth);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return maxValue;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user