Enumeração do intervalo ImmutableSortedDictionary por chave


11

Eu estava lendo sobre C # 's ImmutableSortedDictionaryem System.Collections.Immutablee pensar sobre como aplicá-la no meu programa. Eu gosto bastante de C ++ lower_bounde upper_bound(veja aqui ), e esperava ver algo do tipo para pesquisas de intervalo. No entanto, métodos semelhantes parecem estar estranhamente ausentes da documentação . Estou esquecendo de algo? Ou o MS realmente fornece um dicionário classificado sem acesso eficiente aos intervalos classificados? Isso não parece exatamente algo que alguém poderia fazer em uma IEnumerabledas teclas como, por exemplo, um método de extensão, por isso estou um pouco confuso por não estar vendo algo fornecido diretamente pela coleção.


Eric Lippert compartilhou uma implementação de árvore AVL imutável em 2008. Pelos comentários, não acho que tenha sido particularmente otimizado para velocidade ou eficiência ainda, mas os IBinarySearchTree<K,V>implementos parecem mais próximos do que eu esperaria. Será que ele alguma vez pensou nisso?
precisa

A ImmutableList<T>classe também é implementada como uma árvore AVL. A partir do código fonte :/// The root node of the AVL tree that stores this set.
Theodor Zoulias 13/11/19

Você sabe se eles significam que a lista usa um AVL true para implementar a imutabilidade ou se a própria árvore do AVL é imutável? (talvez não importe, pois eles não expõem a árvore de qualquer maneira).
J Trana

Aqui estão as vantagens do ImmutableList<T>(suportado por uma árvore AVL) sobre o ImmutableArray<T>(suportado por uma matriz), de acordo com a documentação . Razões para usar a lista imutável: 1) A atualização dos dados é comum ou o número de elementos não é pequeno. 2) Atualizar a coleção é mais crítico em termos de desempenho do que iterar o conteúdo.
Theodor Zoulias 14/11/19

Isso ocorre ao adicionar ou excluir um elemento de uma grande árvore AVL, você pode obter uma nova árvore sem destruir a original, compartilhando a maioria dos nós e criando apenas alguns nós. ( Estrutura de dados persistente - Árvores )
Theodor Zoulias 14/11/19

Respostas:


9

É irritante que as coleções internas disponíveis não estejam oferecendo um conjunto completo de recursos (como a SortedDictionaryfalta de um BinarySearchmétodo), forçando-nos a procurar soluções de terceiros (como a biblioteca C5 ).

No seu caso, em vez de um, ImmutableSortedDictionaryvocê provavelmente poderia usar a ImmutableSortedSet, incorporando os valores nas chaves e usando um comparador apropriado. Pelo menos a API desta classe contém as propriedades Mine Max.


2
Como observação lateral, outra classe imutável, a ImmutableList<T>, é implementada internamente como uma árvore . Portanto, é 10 vezes mais lento e aloca 12 vezes mais memória que a List<T>. Use em ImmutableArray<T>vez disso.
Theodor Zoulias

11
Hehe, eu já uso o C5, mas procurando ver o que estava disponível para coleções imutáveis ​​(além dos instantâneos). Obrigado! Vou manter a esperança de que alguém tenha resolvido isso de alguma forma ou meio, mas eu vou manter em mente oImmutableSortedSet
J Trana

@TheodorZoulias, que sentido tem o método BinarySearch em SortedDictionary, quando o método TryGetValue está funcionando no log (N)? Veja aqui
Giorgi Chkhikvadze 13/11/19

2
@GiorgiChkhikvadze, o BinarySearch pode fornecer o próximo elemento maior que o item que você está procurando, caso uma correspondência exata não seja encontrada.
Theodor Zoulias 13/11/19

11
@GiorgiChkhikvadze Provavelmente, a maior diferença aqui é que o valor de retorno não é apenas um valor único na coleção, mas uma maneira de indexar a coleção com eficiência. O método BinarySearch é especial não apenas porque encontra o valor eficientemente, mas porque encontra um índice mesmo no caso de uma falha, como apontou Theodor - o que permite acesso rápido a, por exemplo, uma matriz. No entanto, no caso de uma árvore, um índice inteiro pode não ser uma maneira eficiente de acessar a estrutura; O C ++ resolve isso através do uso de um objeto iterador (embora com suas próprias complexidades).
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.