0

我需要处理具有一组属性的数据,其中属性的数量将在运行时确定。例如,一个数据集可能包含动物,属性可能包括性别、物种、年龄等,其中每个属性都可以用整数(或枚举)表示。我希望能够沿任何维度进行迭代,这样我就可以快速计算男性的总数或狗的数量等。

我正在考虑这样的Java接口:

public interface DynamicMultidimensionalStore<T>
{
  Object getPoint(List<Integer> coordinates);
  void setPoint(List<Integer> coordinates, T item);
  Iterator<T> iterate(int dimension, List<Integer> remainingCoordinates);
  DynamicMultidimensionalStore<T> getSlice(int dimension, int offset);
}

首先,必须有一个名称;立方体?我看到它类似于http://en.wikipedia.org/wiki/Spatial_index#Spatial_index但这些似乎更关注空间关系而不是迭代任意轴。

我能想到的唯一结构是一个将数据存储在线性数组中并执行指针运算来计算偏移量的类。

有更好的解决方案吗?我认为随着数组变得更加稀疏(或随着维度的增加),我的方法会变得不那么有效。

4

1 回答 1

1

如果我正确理解了您的问题,那么可行的“稀疏解决方案”如下。将您的数据集表示为一个字典列表,每个变量一个字典。通过将项目的引用插入到每个字典中来存储项目,由相关属性键入。所以你最终会得到像

{
  feet = {1: {<slug>}, 2: {<bird>, <person>}, 4: {<dog>}},
  fur  = {yes: {<dog>}, no: {<slug>, <bird>, <person>}},
  ...
}

在这里,<slug>应该被读作指向您的对象类型的单个实例的引用/指针。我对 Java 了解不多,因此无法具体说明,但是 C++ 中的实现可以使用std::map键控参数的可能值。然后这些值将被存储为一些通用集合:要么std::list或也许std::set。如果您更喜欢,也许std::multimap会更适合-我不完全确定。

计算具有给定属性的对象应该非常快:您将查询在哈希表中查找的某个容器的长度。主要的缺点是您有n*k指针(或引用或或...),其中n是对象k的数量和轴的数量。这对您来说可能合适,也可能不合适。

于 2012-08-21T22:33:28.617 回答