多维数组的数据结构,其中维度的数量在运行时确定

时间:2012-08-17 13:11:07

标签: data-structures multidimensional-array

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

我正在考虑像这样的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类似,但这些似乎更侧重于空间关系而不是在任意轴上迭代。

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

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

1 个答案:

答案 0 :(得分:1)

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

这样的数据
{
  feet = {1: {<slug>}, 2: {<bird>, <person>}, 4: {<dog>}},
  fur  = {yes: {<dog>}, no: {<slug>, <bird>, <person>}},
  ...
}

这里,<slug>应该被读作指向对象类型的单个实例的引用/指针。我对Java知之甚少,所以我不能具体说明,但是用C ++实现可以使用std::map键入参数的可能值。然后,这些值将存储为一些常规集合:std::liststd::set。如果你是发烧友,也许std::multimap会更合适 - 我不完全确定。

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