2012-08-17 35 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