假设Node 和NumberPair 的结构如下:
public class Node {
List <NumberPair> numbers = new ArrayList<>();
// Implementation
}
public class NumberPair {
int x, y;
// ctor, getters, setters, etc
}
Map <String, Map<String, Integer>> returnOverlaps(Map <String, Node> myVertices) {
Map <String, Map<String, Integer> > overlaps = new HashMap<>();
for (Map.Entry<String, Node> entry : myVertices.entrySet())
{
for (Map.Entry<String, Node> entry2 : myVertices.entrySet()) {
compare(entry, entry2, overlaps);
}
}
return overlaps;
}
void compare (Map.Entry <String, Integer> entry1, Map.Entry <String, Integer> entry2, Map <String, Map<String, Integer>> overlaps) {
String key1 = entry1.getKey();
Map <String, Integer> map = overlaps.get(key1);
if (map == null)
map = new HashMap<>();
String key2 = entry2.getkey();
Node node1 = entry1.getValue();
Node node2 = entry2.getValue();
if (key1.equals(key2)) {
// self
map.put(key1, node1.getNumbers().size());
}
else {
map.put(key2, 0);
for (NumberPair x : node1.getNumbers()) {
for (NumberPair y : node2.getNumbers()) {
if (x.first() == y.first()) {
// Crude brute force compare, I like 'Zoran Regvart''s approach above of sorting and comparing upper/lower bounds.
map.put(key2, map.get(key2) + 1 );
}
}
}
}
overlaps.put(key1, map);
}
有点复杂,这是overlaps 的样子。
它将每个 jobName 映射到一个 map,其中包含其他 jobNames 以及与它们共享的重叠数
如果你有:
job1=[[16, 18], [21, 23]], job2=[[16, 17]],
job3= [[20, 21]], job4= [[21, 29], [20, 24]], [16, 2]]
overlaps 看起来像
job1 -> [job1 = 1], [job2 = 1], [job3 = 0], [job4 = 2]
job2 -> [job1 = 1], [job2 = 1], [job3 = 0], [job4 = 2]
job3 -> [job3 = 1], [job2 = 0], [job1 = 0], [job4 = 1]
job4 -> [job3 = 1], [job2 = 0], [job1 = 1], [job4 = 3]
如果您想检查 job3 和 job4 共享多少重叠,您会这样做
(overlaps.get("job3")).get("job4");
我没有测试过这个,也没有优化过(它不能避免多余的工作,例如,如果你已经发现 job1 和 job3 的重叠,你不应该为 job3 和 job1 .) 似乎是一个有趣的问题,所以我想我会试一试:)