2010-06-29 32 views
1

我正在寫一些我自己的數據結構,比如二叉樹和四叉樹以及kD樹。是否有可能以允許任何維度的方式編寫它們?是否可以實現通用維數據結構?

喜歡的東西:

KDTree<2, string> twoDTree = new KDTree<2, string>(); 
twoDTree[3,4] = "X,Y = (3,4)"; 

KDTree<4, string> fourDTree = new KDTree<4, string>(); 
fourDTree[0,1,2,3] = "x1,x2,x3,x4 = (0,1,2,3)"; 

我現在已經是明確創建每個維度,因爲它是自己的類唯一的解決辦法:

TwoDTree<string> twoDTree = new TwoDTree<string>(); 
twoDTree[3,4] = "X,Y = (3,4)"; 

FourDTree<string> fourDTree = new FourDTree<string>(); 
fourDTree[0,1,2,3] = "x1,x2,x3,x4 = (0,1,2,3)"; 

但這種複製粘貼一噸的代碼,這應該能夠以某種方式重用。

回答

1

不是真的,但我看到更多的選項:

傳尺寸到構造和使用索引這樣的:

public string this[params int[] indexes] { 
    get { 
    // return the data fr the index 
    } 
} 

這已經不是「安全類型」在編譯時的缺點(如傳入的尺寸將不會被檢查出來)。

或者創建了一堆的界面和使用Reflection.Emit的創建,其在運行時實現正確的接口實例:

public interface IMultiDimensional<T> { 
    int Dimensions { 
    get; 
    } 

    int Rank(int dimension); 
} 

public interface I1Dimensional<T>: IMultiDimensional<T> { 
    T this[int index] { 
    get; 
    set; 
    } 
} 

public interface I2Dimensional<T>: IMultiDimensional<T> { 
    T this[int index1, int index2] { 
    get; 
    set; 
    } 
} 

public interface I3Dimensional<T>: IMultiDimensional<T> { 
    T this[int index1, int index2, int index3] { 
    get; 
    set; 
    } 
} 

public interface I4Dimensional<T>: IMultiDimensional<T> { 
    T this[int index1, int index2, int index3, int index4] { 
    get; 
    set; 
    } 
} 

public static TDimensional CreateMulti<TDimensional, TType>() where T: IMultiDimensional<TType> { 
    // emit a class with Reflection.Emit here that implements the interface 
} 

I4Dimensional<string> four = CreateMulti<I4Dimensional<string>, string>(); 
four[1,2,3,4] = "abc"; 
0

您可以使用多維數組作爲通用參數,像這樣:

KDTree<string[,,,]> 

但是,您將無法編寫通用代碼索引到多維數組,不能暴露給調用者:您可以考慮使用jagged arrays而不是多維數組。然後,您可以創建一個定義的數據的類型泛型類,並在構造函數中指定多少維度使用:

public class KDTree<T> { 
    private readonly T[][] m_Data; 

    public KDTree(int rows, int columns) { 
     m_Data = new T[rows][]; 
     for(int r = 0; r < rows; r++) 
     m_Data[r] = new T[columns]; 
    } 
} 
相關問題