我一直试图设计一种算法,可以从另一个N维空间中减去N维空间的块。
为了简单起见,底部的餐巾草图显示了使用二维空间的数学和视觉效果。
业务问题: 想象一下,所有可能的组合都有30组数据(在这种情况下意味着30维空间)。笛卡尔积可以显示所有可能的组合,但问题是我需要反转它。当我说出15个30维数据的实例时,我可以通过最初的30维空间进行查看,看看是否有任何事情未被发现。
第一个问题是我没有找到任何第三方JAVA库来处理这个 - 也许我没有使用正确的关键字,我的教育不是英语。
现在第二个问题是我试图在java中解决这个问题。如您所见,在表示结构的XY坐标空间旁边有一个简化的UML图。对于数据存储,我想使用 Map<Object, Set<String>>
(对象是维度,而Set是其值)因为我不想限制哪个键应该代表维度而我希望我的维度保持字符串值,因为它们已经覆盖 hashCode 和等于方法。
所以我一直致力于为SimpleSpace减去算法:
public AbstractSpace subtract(AbstractSpace abstractSpace) {
//Some checks
if (!(abstractSpace instanceof SimpleSpace)) {
return null;
}
if (getDimensions().size() != abstractSpace.getDimensions().size()) {
return null;
}
if (!getDimensions().equals(abstractSpace.getDimensions())) {
return null;
}
SimpleSpace spaceToRemove = (SimpleSpace) abstractSpace;
final Map> template = Maps.newHashMap();
final Set prevDimension = Sets.newHashSet();
final List result = Lists.newArrayList();
//getDimensions() just retrieves the SimpleSpace Map.keySet()
for (Object dimension : getDimensions()) {
//copy method makes a deep copy of current simpleSpace map as I do not want to change state of SimpleSPace instance
SimpleSpace editSpace = copy();
editSpace.remove(dimension, spaceToRemove.getValues(dimension));
//This bit over here is implementation of my poor math understandment
for (Object prevKey : prevDimension) {
editSpace.getValues(prevKey).removeAll(template.get(prevKey));
}
prevDimension.add(dimension);
template.put(dimension, editSpace.getValues(dimension));
result.add(editSpace);
}
//I remove all simpleSpaces which have a dimension with empty set (this is not efficient but this is the first iteration)
Iterables.removeIf(result, new Predicate() {
@Override
public boolean apply(SimpleSpace input) {
return input.isEmpty();
}
});
return new CompositeSpace(result);
}
虽然这可行,但我似乎使用了二维示例,我不完全理解如何使用N维空间进行测试。
我是否应该(添加)所有复合空间重新组合以尝试查看分解的N维空间是否可以重新组合在一起?顺便说一句,也许有人可以提出更有效的算法?
如果缺少任何信息,请告诉我。
谢谢。
答案 0 :(得分:1)
这实际上是伪装的约束编程问题。每个维度对应一个变量及其可能的值。每个SimpleSpace对应于一个约束,该约束请求至少一个变量具有指定子集之外的值。未覆盖的点和可行的解决方案是一一对应的。即使是基本的约束编程库也会对蛮力有相当大的改进。