【问题标题】:Multi-dimensional space algorithm多维空间算法
【发布时间】: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 值因为他们已经重写了 hashCodeequals 方法。

所以我一直在研究 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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-02-20
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多