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


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는 속성이 들어 Min와 Max.


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.