.NET에 Tree <T> 클래스가없는 이유는 무엇입니까?


87

.NET의 기본 클래스 라이브러리에는 컬렉션 (List, Queue, Stack, Dictionary)에 대한 우수한 데이터 구조가 있지만 이상하게도 바이너리 트리에 대한 데이터 구조는 포함되어 있지 않습니다. 이것은 다른 순회 경로를 이용하는 것과 같은 특정 알고리즘에 매우 유용한 구조입니다. 올바르게 작성된 무료 구현을 찾고 있습니다.

나는 단순히 눈이 멀고 그것을 찾지 못하는 것입니까 ... BCL 어딘가에 묻혀 있습니까? 그렇지 않다면 누군가 바이너리 트리 용 무료 또는 오픈 소스 C # /. NET 라이브러리를 추천 할 수 있습니까? 제네릭을 사용하는 것이 바람직합니다.

편집 : 내가 찾고있는 것을 명확히하기 위해. 내부적으로 트리를 사용하는 정렬 된 사전 컬렉션에는 관심이 없습니다. 저는 실제로 이진 트리에 관심이 있습니다. 구조를 노출하여 하위 트리 추출과 같은 작업을 수행하거나 노드에서 수정 후 순회를 수행 할 수 있습니다. 이상적으로 이러한 클래스는 특수 트리의 동작을 제공하도록 확장 될 수 있습니다 (예 : Red / Black, AVL, Balanced 등).


동의합니다. 때때로 값을 묶은 두 노드를 (O (Log N) 시간에) 찾을 필요가 있습니다 (값이 컬렉션에서 찾을 수없는 경우). 예를 들어 컬렉션 (트리)에는 13 개와 17 개 (다른 것 중에서)가 포함되어 있고 16 개보다 작거나 큰 것을 찾고 있습니다. 트리는이를 수행 할 수 있지만 사전, 정렬 된 목록 및 해시 테이블은 O (N)을 사용합니다. .
Les

답변:


31

당신 말이 맞아요, BCL에는 아무것도 없습니다. 나는 이것이 트리를 사용할지 여부를 선택하는 것이 일반적으로 구현 세부 사항이고 그렇지 않으면 데이터에 액세스하는 비 전통적인 방법이기 때문이라고 생각합니다. 즉, "binary-search-for element # 37"이라고 말하지 않습니다. 대신 "요소 # 37 가져 오기"라고 말합니다.

하지만 C5보셨습니까 ? 매우 편리하며 여러 트리 구현 ( 1 , 2 , 3 )이 있습니다.


3
C5는 B-Tree가 아닌 Red Black 트리를 지원합니다. 사람들이 알아야 할 차이점입니다. B-Tree는 디스크 기반 트리 또는 대용량 메모리 기반 트리에 더 적합합니다. 더 많은 노드가 동일한 지역에 보관되므로 프로세서 캐시 성능이 향상되고 디스크에 쓰기 속도가 빨라집니다.
AnthonyLambert

68

직접 정의 할 수 있습니다.

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}

또는 키 없음 :

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}

그러나 이것은 컴파일 타임에 처리 할 트리 레벨 수를 알아야합니다. 내가 틀렸습니까?
Veverke 16.04.03

1
아니요, C # 컴파일러는이 구문을 지원합니다.
제이슨

2
요소는이 방법 않은 정렬 조심하십시오
세바스찬

@Veverke 아마도 당신은 C ++ 템플릿을 생각하고 있었을 것입니다. .NET 제네릭은 런타임 유형입니다.
Tom Blodget

궁금해. 이것을 어떻게 사용합니까? 거의? 샘플이 있습니까?
Syaiful Nizam Yahya

39

그러한 구현에서 원하는 것은 무엇입니까?

이진 트리? 레드 블랙? 기수 나무? B- 트리? R- 트리? R *-트리?

트리는 데이터 구조 라기보다 패턴이며 성능이 중요한 곳에서 사용되는 경향이 있습니다 (따라서 구현 세부 사항도 중요 할 것입니다). BCL에 어떤 종류의 트리 클래스가 포함되어 있다면 어쨌든 자신의 것을 롤링하면됩니다.


1
질문의 "이유"부분에 대한 최상의 답변입니다.
Joel Coehoorn

그리고 그것들은 검색 트리 일뿐입니다. 또한 표현 트리, 의사 결정 머릿단, ...
Henk Holterman

실제로 구현 세부 사항이 중요합니다. 제 경우에는 일련의 변환의 일부로 구성된 데이터 집합에 대해 서로 다른 순회 (중위, 접미사)를 수행하는 알고리즘을 구현하려고합니다. 트리 구조는 내 문제를 해결하는 가장 우아한 방법입니다.
LBushkin

11
병렬 우주에서 누군가 ".Net에 목록 유형이없는 이유는 무엇입니까?"라는 질문을하면 "이러한 구현에서 원하는 것은 무엇입니까? 배열? 연결된 목록? 대기열? A 사전?" 나는 이것이 비 평등하지 않은 대답이라고 생각합니다.
rymdsmurf


12

SortedSet<T>이진 검색 트리 ref 로 구현됩니다 .SortedDictionary<TKey, TValue>내부적으로 사용 SortedSet<T>하므로 이진 검색 트리 ref 입니다.


5
불행히도 이것들은 단순히 정렬 된지도와 목록의 구현입니다. 둘 다 이진 트리로 재사용하는 데 도움이되지 않습니다. 이러한 트리 구조는 단순히 컬렉션의 구현 세부 사항 일뿐입니다. 실제로 트리 구조를 노출하는 클래스를 찾고 있습니다.
LBushkin

9

아니요, Tree<T>BCL에는 " -like"유형 이 없지만 (항상 저를 당황하게하는 것) 여기에 좋은 기사가 있습니다. 에 C #에서 직접 구현하는 방법을 안내 가 있습니다.

.NET이 일반적으로 사용되는 응용 프로그램 (비즈니스 응용 프로그램, 데이터 이동 응용 프로그램 등)에서 트리 기반 데이터 구조가 덜 일반적으로 사용된다는 주장을 할 수있을 것 같습니다. 그래도 동의합니다. BCL이 전혀 구현되지 않은 것이 이상합니다.



-5

사용할 수 있는 TreeNode 가 있습니다. 일반적이지 않고 Windows 양식에 숨겨져 있고 treeview 컨트롤과 함께 사용되지만 다른 곳에서도 사용할 수 있습니다.


예,하지만 System.Object ype의 Tag 속성 만 있습니다. 일반 <T> 매개 변수 없음
Henk Holterman 2009-06-02

3
나는 항상 그런 일을하는 것이 이상하다. 특정 예제에서는 눈에 잘 띄지 않지만 사람들이 종속성에서 클래스를 일상적으로 다시 사용하는 경우 설명하기 어려운 종속성이 발생할 수 있으며 용도가 변경된 클래스가 예기치 않은 방식으로 변경되면 문제가 발생할 수 있습니다. 종속성 버전.
Paul Morie

4
그것을 사용하면 어떤 이익이 있습니까? 트리 노드에는 일반적으로 관련 기능이 없습니다. 그것은 단지 자녀와 결국 부모에 대한 참조를 보유합니다. System.Windows.Forms 클래스를 오용 할 이유가 없습니다! 1 분 이내에 직접 작성하세요.
user492238 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.