【发布时间】:2015-03-20 10:25:21
【问题描述】:
我一直在尝试设计一种算法,可以从另一个 N 维空间中减去 N 维空间块。
为了简单起见,底部的餐巾草稿使用二维空间显示了一些数学和视觉效果。
业务问题: 想象一下所有可能组合的 30 组数据(在这种情况下意味着 30 维空间)。笛卡尔积会显示所有可能的组合,但问题是我需要反转它。做到这一点,当我得到 15 个 30 维数据实例时,我可以在最初的 30 维空间中分块,看看是否有任何未被发现的东西。
第一个问题是我没有找到任何 3rd 方 JAVA 库来处理这个问题 - 也许我没有使用正确的关键字,我的教育不是英语。
现在第二个问题是我正在尝试在 java 中解决这个问题。如您所见,在表示结构的 XY 坐标空间旁边有一个简化的 UML 图。对于数据存储,我想使用 Map<Object, Set<String>> (Object 是维度,Set 是它的值)因为我不想限制应该代表维度的键,我希望我的维度保存 String 值因为他们已经重写了 hashCode 和 equals 方法。
所以我一直在研究 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 维空间重新组合在一起?顺便说一句,也许有人可以提出更有效的算法?
如果缺少任何信息,请告诉我。
谢谢。
【问题讨论】:
-
这个问题属于cs.stackexchange.com
标签: java algorithm multidimensional-array