키를 기준으로 불변의 정렬 된 사전 범위 열거


11

나는 'C 번호에 대한 책을 읽은이야되었다 ImmutableSortedDictionary에서 System.Collections.Immutable내 프로그램에 적용하는 방법에 대한 생각. 나는 C ++을 좋아 lower_bound하고 upper_bound( here 참조 ) 오히려 범위 조회를 위해 일종의 무언가를 기대하고있었습니다. 그러나 유사한 방법 은 문서에서 이상하게 보이지 않는 것 같습니다 . 뭔가 빠졌습니까? 또는 MS는 정렬 된 범위에 효율적으로 액세스하지 않고 정렬 된 사전을 제공합니까? 그것은 IEnumerable확장 방법이라고 말하면 키 중 하나에서 할 수있는 것처럼 보이지 않으므로 컬렉션에서 직접 제공 한 것을 보지 못합니다.


Eric Lippert 는 2008 년에 불변의 AVL 트리 구현을 공유 했습니다. 의견에서, 아직 속도 나 효율성에 대해 최적화 된 것은 아니라고 생각하지만 IBinarySearchTree<K,V>구현은 기대했던 것에 더 가깝습니다. 그가 그것에 대해 더 고민했는지 궁금해?
J Trana

ImmutableList<T>클래스는 AVL 트리로도 구현됩니다. 로부터 소스 코드 :/// The root node of the AVL tree that stores this set.
테오도르 Zoulias

목록이 AVL true를 사용하여 불변성을 구현하는지 또는 AVL 트리 자체가 불변인지 여부를 알고 있습니까? (어쨌든 나무를 노출시키지 않기 때문에 중요하지 않을 수도 있습니다).
J Trana

문서 에 따르면 ( ImmutableList<T>AVL 트리에 의해 지원)과 ImmutableArray<T>(배열에 의해 지원 )에 비해 ( AVL 트리에 의해 지원) 의 장점은 다음과 같습니다 . 불변 목록을 사용해야하는 이유 : 1) 데이터 업데이트가 일반적이거나 요소 수가 적을 것으로 예상되지 않습니다. 2) 컬렉션을 업데이트하는 것은 내용을 반복하는 것보다 성능이 더 중요합니다.
Theodor Zoulias

큰 AVL 트리에서 요소를 추가하거나 삭제할 때 대부분의 노드를 공유하고 몇 개의 새 노드 만 만들어 원래 트리를 손상시키지 않고 새 트리를 얻을 수 있기 때문입니다. ( 지속 데이터 구조 - 트리 )
테오도르 Zoulias

답변:


9

사용 가능한 내장 컬렉션이 전체 기능 세트를 제공하지 않고 ( 메소드 가 SortedDictionary없는 등 BinarySearch) 타사 솔루션 (예 : C5 라이브러리 ) 을 검색하도록 강요합니다 .

대신의 귀하의 경우에 ImmutableSortedDictionary당신은 아마 사용할 수 ImmutableSortedSet있는 키의 값을 삽입하고 적절한 비교자를 사용하여. 적어도이 클래스의 API는 속성이 들어 MinMax.


2
부수적으로, 또 다른 불변 클래스 인는 ImmutableList<T>내부적 으로 트리로 구현 됩니다 . 따라서 10 배 더 느리고 a보다 12 배 더 많은 메모리를 할당합니다 List<T>. ImmutableArray<T>대신 사용하십시오 .
Theodor Zoulias

1
Hehe, 나는 이미 C5를 사용하고 있지만 불변 컬렉션 (스냅 샷 제외)에 사용할 수있는 것을 찾고 있습니다. 감사! 나는 다른 사람이 어떤 방법으로 모양이나 형태로이 문제를 해결했다 희망을 버틸거야,하지만 난 마음에하겠습니다ImmutableSortedSet
J Trana

@ GetodorZoulias TryGetValue 메소드가 log (N)에서 작동 할 때 SortedDictionary에 BinarySearch 메소드가 있다는 점은 무엇입니까? 여기를 참조하십시오
Giorgi Chkhikvadze

2
@GiorgiChkhikvadze BinarySearch 는 정확히 일치하는 항목을 찾을 수없는 경우 검색중인 항목보다 큰 다음 요소를 제공 할 수 있습니다.
Theodor Zoulias

1
@GiorgiChkhikvadze 아마도 여기서 가장 큰 차이점은 반환 값이 컬렉션의 단일 값이 아니라 컬렉션에 효율적으로 인덱스하는 방법이라는 것입니다. BinarySearch 메서드는 값을 효율적으로 찾는 것뿐만 아니라 Theodor가 지적한대로 누락 된 경우에도 인덱스를 찾기 때문에 특별합니다. 예를 들어 배열에 빠르게 액세스 할 수 있습니다. 그러나 트리의 경우 정수 인덱스는 구조에 액세스하는 효율적인 방법이 아닐 수 있습니다. C ++은 반복자 객체 (자체 복잡도는 있음)를 사용하여이를 해결합니다.
J Trana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.