2013-04-10 3 views
0

디렉터리 트리와 비슷한 메모리 내 트리 구조가 있습니다. 즉, 각 노드에는 명명 된 하위 노드 사전이 있습니다. 목록이나 이름 배열에서 트리를 효율적으로 트래버스하는 방법이 필요합니다.효율적인 트리 인수 재귀, 효율적인 하위 배열 또는 하위 목록

트래버스하려는 하위 노드 목록 ({ "생물체", "영장류", "인간", "남성", "존 스미스"} 및 루트 노드에서 시작하여 반복적으로 한 단계 만 처리하면 나머지 sub-list를 서브 노드로 전달하면 this.subNodes [myList [0]]. GetSubNode (myList.GetRange (1, myList.Count-1)) ... List.GetRange()가 얕은 복사를하면 모든 재귀 수준에 대해 새로운 목록이 생성됩니다. 전체 작업은 매우 시간과 공간이 비효율적 인 것처럼 보입니다.

배열을 사용하려고하면 하위 배열을 만들 때 찾을 수있는 가장 좋은 방법은 Array.Copy이고 다시 얕은 복사본입니다. 같은 문제.

목록의 머리 부분이 다른 개체에 대한 다른 포인터를 가진 개체에 대한 포인터 일 뿐이므로 하위 목록을 가져 오는 것은 하나의 포인터를 따르는 것처럼 간단합니다. 또는 배열은 일부 메모리에 대한 포인터 일 뿐이므로 하위 배열을 가져 오는 것은 포인터를 증가시키는 것만 큼 간단합니다. 매우 효율적인 시간과 공간. C#에서 이것을 수행 할 수있는 방법이 있습니까?

, 현재, C#으로, 나는

... 난 그냥 재귀를 잊고 최상위 레벨에서 반복의 일종을 할 필요가 생각하고 아니면 내가 재귀 인수로 수정되지 않은 배열을 전달할 수 있습니다 각 수준에서 더 깊어 질 int 인덱스와 함께. 어떤 재귀 호출을 전달해야 할 필요가 있다는 것을 제외하고는 괜찮습니다. n 번째 재귀 호출에 대한 통신이 유일한 목적은 "배열의 첫 번째 n 개 항목 무시"입니다 ... 괜찮습니다. 유일한 해결책 (또는 가능한 최선의 해결책)이라면 바보처럼 보인다.

더 좋은 방법이 있습니까?

답변

1

.net에는 LinkedList implementation이 있으며, 다음 LinkedListNode를 메소드에 전달할 수 있습니다.

이외에도 색인을 사용한 접근 방식도 좋습니다. 적어도 추가 메모리를 사용하지는 않습니다.

또한 C와 같이 배열 요소에 포인터를 전달할 수있는 방법이 있습니다.하지만 안전하지 않은 모드로 프로그램을 컴파일해야하므로 바람직하지 않은 경우가 많습니다.

+0

허. List 클래스 외에도 LinkedList 클래스가 있는지 전혀 몰랐습니다. 현재의 목적을 위해,이 답변은 절대적으로 효과가 있습니다. 감사합니다. 그러나 누군가가 서브리스트 또는 서브 어레이를 생성하는 좋은 방법을 제안 하는지를보기 위해 이것을 이것을 대답으로 표시하기 전에 조금 기다릴 것입니다. –