【发布时间】:2009-11-23 18:13:12
【问题描述】:
我已经设置了一组唯一的地图(目前是 Java HashMaps),并希望从中删除任何完全由该集中其他地图包含的地图(即,如果 m.entrySet() 是一个n.entrySet() 的子集,用于 s 中的其他 n。)
我有一个 n^2 算法,但它太慢了。有没有更有效的方法来做到这一点?
编辑:
如果有帮助的话,可能的键集很小。
这是一个低效的参考实现:
public void removeSubmaps(Set<Map> s) {
Set<Map> toRemove = new HashSet<Map>();
for (Map a: s) {
for (Map b : s) {
if (a.entrySet().containsAll(b.entrySet()))
toRemove.add(b);
}
}
s.removeAll(toRemove);
}
【问题讨论】:
-
如果
m是s的严格子集,您只想从s中删除m的映射? -
如果我的输入是 {{a:1, b:1},{a:1}} 我想要输出 {{a:1, b:1}} 因为 {a:1}是 {a:1, b:1} 的子图
-
这更像是 O(n^2*m),其中 m 是最大 Map 的大小
-
如果输入是{{a: 1, b: 1}, {c: 1}, {b: 1, c: 1}},你只想要{{a: 1, b : 1} , {c: 1}} 还是全部 3 个?如果是前者,你到底需要这个做什么?
-
输入 {{a: 1, b: 1}, {c: 1}, {b: 1, c: 1}} 应该给出 {{a: 1, b: 1} , {b: 1, c: 1}} 因为 {c: 1} 是 {b: 1, c: 1} 的子图