- Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathBalancedSystemFilePartition.java
More file actions
Latest commit
89 lines (74 loc) · 2.69 KB
/
Copy pathBalancedSystemFilePartition.java
File metadata and controls
89 lines (74 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
importjava.util.HashMap;
importjava.util.HashSet;
importjava.util.List;
importjava.util.Map;
importjava.util.Set;
publicclassBalancedSystemFilePartition {
publicstaticvoidmain(String[] args) {
}
}
classResult {
/*
* Complete the 'mostBalancedPartition' function below.
*
* The function is expected to return an INTEGER.
* The function accepts following parameters:
* 1. INTEGER_ARRAY parent
* 2. INTEGER_ARRAY files_size
*/
publicstaticintmostBalancedPartition(List<Integer> parent, List<Integer> fileSizes) {
DirectedGraphgraph = newDirectedGraph();
for (intindex = 0 ; index < parent.size() ; index++) {
graph.addVertex(index, fileSizes.get(index));
if (index != 0) {
graph.addEdge(parent.get(index), index);
}
}
returngraph.mostBalancedPartition();
}
privatestaticclassDirectedGraph {
Map<Integer, Vertex> vertices = newHashMap<>();
privatelongdiskSize;
privatestaticclassVertex {
privatefinalintfileSize;
privatelongtotalMemoryRequired;
Set<Vertex> edges = newHashSet<>();
Vertex(intfileSize) {
this.fileSize = fileSize;
}
voidaddEdge(Vertexto) {
this.edges.add(to);
}
}
publicvoidaddVertex(intdata, intfileSize) {
vertices.put(data, newVertex(fileSize));
}
publicvoidaddEdge(intfrom, intto) {
VertexfromVertex = vertices.get(from);
fromVertex.addEdge(vertices.get(to));
}
intmostBalancedPartition() {
computeFileDataDistribution();
returnmostBalancedPartition(vertices.get(0));
}
privatevoidcomputeFileDataDistribution() {
diskSize = computeFileDataDistribution(vertices.get(0));
}
privatelongcomputeFileDataDistribution(Vertexcurrent) {
longtotalMemoryRequired = current.fileSize;
for (Vertexchild : current.edges) {
totalMemoryRequired += computeFileDataDistribution(child);
}
current.totalMemoryRequired = totalMemoryRequired;
returncurrent.totalMemoryRequired;
}
privateintmostBalancedPartition(Vertexcurrent) {
intresult = Integer.MAX_VALUE;
for (Vertexchild : current.edges) {
result = Math.min(result, mostBalancedPartition(child));
result = (int) Math.min(result, Math.abs(diskSize - 2 * child.totalMemoryRequired));
}
returnresult;
}
}
}