2010-06-29 6 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[,,,]> 

그러나 발신자에 노출하지 않고, 다차원 배열에 인덱스 일반적인 코드를 작성 할 수 없을 것입니다 :

public class KDTree<MDT> { 
    // ... 

    public MDT Data { get; } 
} 

var twoTree = new KDTree<string[,]>(); 
twoTree.Data[3,4] = "X,Y = (3,4)"; 

다차원 배열이 아닌 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]; 
    } 
} 
관련 문제