mirror of
https://github.com/TheAlgorithms/Java.git
synced 2026-03-13 08:40:43 +08:00
Add BandwidthAllocation algorithm (#5807)
This commit is contained in:
@@ -320,11 +320,14 @@
|
||||
* [BresenhamLine](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/geometry/BresenhamLine.java)
|
||||
* [ConvexHull](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/geometry/ConvexHull.java)
|
||||
* [GrahamScan](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/geometry/GrahamScan.java)
|
||||
* [MidpointCircle](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/geometry/MidpointCircle.java)
|
||||
* [MidpointEllipse](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/geometry/MidpointEllipse.java)
|
||||
* [Point](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/geometry/Point.java)
|
||||
* graph
|
||||
* [StronglyConnectedComponentOptimized](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/graph/StronglyConnectedComponentOptimized.java)
|
||||
* greedyalgorithms
|
||||
* [ActivitySelection](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/ActivitySelection.java)
|
||||
* [BandwidthAllocation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/BandwidthAllocation.java)
|
||||
* [BinaryAddition](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/BinaryAddition.java)
|
||||
* [CoinChange](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/CoinChange.java)
|
||||
* [DigitSeparation](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/DigitSeparation.java)
|
||||
@@ -360,6 +363,7 @@
|
||||
* [Average](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Average.java)
|
||||
* [BinaryPow](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/BinaryPow.java)
|
||||
* [BinomialCoefficient](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/BinomialCoefficient.java)
|
||||
* [CatalanNumbers](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CatalanNumbers.java)
|
||||
* [Ceil](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Ceil.java)
|
||||
* [ChineseRemainderTheorem](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/ChineseRemainderTheorem.java)
|
||||
* [CircularConvolutionFFT](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/CircularConvolutionFFT.java)
|
||||
@@ -967,10 +971,13 @@
|
||||
* [BresenhamLineTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/geometry/BresenhamLineTest.java)
|
||||
* [ConvexHullTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/geometry/ConvexHullTest.java)
|
||||
* [GrahamScanTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/geometry/GrahamScanTest.java)
|
||||
* [MidpointCircleTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/geometry/MidpointCircleTest.java)
|
||||
* [MidpointEllipseTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/geometry/MidpointEllipseTest.java)
|
||||
* graph
|
||||
* [StronglyConnectedComponentOptimizedTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/graph/StronglyConnectedComponentOptimizedTest.java)
|
||||
* greedyalgorithms
|
||||
* [ActivitySelectionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/ActivitySelectionTest.java)
|
||||
* [BandwidthAllocationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/BandwidthAllocationTest.java)
|
||||
* [BinaryAdditionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/BinaryAdditionTest.java)
|
||||
* [CoinChangeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/CoinChangeTest.java)
|
||||
* [DigitSeparationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/greedyalgorithms/DigitSeparationTest.java)
|
||||
@@ -1003,6 +1010,7 @@
|
||||
* [AverageTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/AverageTest.java)
|
||||
* [BinaryPowTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/BinaryPowTest.java)
|
||||
* [BinomialCoefficientTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/BinomialCoefficientTest.java)
|
||||
* [CatalanNumbersTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CatalanNumbersTest.java)
|
||||
* [CeilTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CeilTest.java)
|
||||
* [ChineseRemainderTheoremTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/ChineseRemainderTheoremTest.java)
|
||||
* [CollatzConjectureTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.thealgorithms.greedyalgorithms;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.util.stream.Stream;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.Arguments;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
|
||||
public class BandwidthAllocationTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@MethodSource("bandwidthProvider")
|
||||
public void testMaxValue(int capacity, int[] bandwidths, int[] values, int expected) {
|
||||
assertEquals(expected, BandwidthAllocation.maxValue(capacity, bandwidths, values));
|
||||
}
|
||||
|
||||
private static Stream<Arguments> bandwidthProvider() {
|
||||
return Stream.of(Arguments.of(50, new int[] {20, 10, 30}, new int[] {40, 20, 30}, 80), Arguments.of(0, new int[] {5, 10}, new int[] {10, 20}, 0), Arguments.of(5, new int[] {5, 10}, new int[] {10, 20}, 10), Arguments.of(15, new int[] {10, 20}, new int[] {10, 25}, 18),
|
||||
Arguments.of(25, new int[] {10, 15, 20}, new int[] {10, 30, 50}, 60));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user