2012-08-17 52 views
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类似,但是这些看起来更关注于空间关系而不是遍历任意轴。

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

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

回答

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是轴的数量。这对你来说可能会也可能不会。

+0

这就是我的想法。谢谢回复。我很惊讶这个话题没有得到更多的关注。看起来这肯定是一个常见问题,但我无法找到任何解决方案。 – 2012-08-27 20:30:06