java - 多维空间算法

标签 java algorithm multidimensional-array

A napkin draft of my problem.

我一直在尝试设计一种算法,可以从另一个 N 维空间中减去 N 维空间的 block 。

为了简单起见,底部的餐巾纸草稿使用二维空间显示了一些数学和视觉效果。

业务问题: 想象一下有 30 组数据(在本例中意味着 30 维空间)的所有可能组合。笛卡尔积会向我显示所有可能的组合,但问题是我需要反转它。做到这一点,当我获得 15 个 30 维数据实例时,我可以在最初的 30 维空间中分块,看看是否还有任何未被覆盖的内容。

第一个问题是我没有找到任何第三方 JAVA 库来处理这个问题 - 也许我没有使用正确的关键字,我的教育不是英语。

现在第二个问题是我正在尝试用 java 来解决这个问题。正如您所看到的,代表结构的 XY 坐标空间旁边有一个简化的 UML 图。对于数据存储,我想使用 Map<Object, Set<String>> (对象是维度,集合是其值)因为我不想限制哪个键应该代表维度,并且我希望我的维度保存字符串值,因为它们已经具有 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 维空间重新组合在一起?顺便问一下,也许有人可以建议一种更有效的算法?

如果缺少任何信息,请告诉我。

谢谢。

最佳答案

这实际上是一个变相的约束规划问题。每个维度对应一个变量及其可能的值。每个 SimpleSpace 对应一个约束,要求至少一个变量具有指定子集之外的值。未发现的点和可行解是一一对应的。即使是基本的约束编程库也会比暴力破解有相当大的改进。

关于java - 多维空间算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29164313/

相关文章:

python - 将图像另存为numpy数组

java - Android-根据特定条件跳过View pager中的页面

java - 使用类型信息优雅地忽略 Jackson JSON 反序列化中的未知类?

java - 使用正则表达式验证电子邮件的最大长度

algorithm - 从 n 中选择 k

algorithm - 我可以使用什么算法来生成简单的人类可读的容错字符串?

algorithm - 为应用程序学习和应用算法

java - 文字不显示(初学者)

C# 从泛型数组中获取泛型 IEnumerator

swift - 如何将 [[String]] 的字符串值与字符串进行比较?