Os dicionários C # são uma maneira simples de descobrir se algo existe, etc. etc. Eu tenho uma pergunta sobre como eles funcionam. Digamos que, em vez de um dicionário, eu use um ArrayList. Em vez de usar ContainsKey
(ou um método equivalente em outro idioma), percorro o ArrayList para verificar se existe algo lá (ou executando uma pesquisa binária se os dados são classificados ou algo semelhante). Qual a diferença de eficiência? O ContainsKey
método está usando uma maneira mais eficiente, em vez de percorrer as chaves e verificar se o que estou procurando existe?
Se digamos que eu criei uma função hash específica que corresponde ao tipo de dados que estou tendo e foi especificamente projetada para esse conjunto de dados, então sim, essa função hash é realmente mais rápida do que repetir os dados. Mas os dicionários são gerais. O método ContainsKey não é específico dos dados que obtém, é um método de pesquisa geral.
Basicamente, o que estou perguntando é. Dicionários são úteis para programadores. Eles incluem métodos que ajudam com muitas coisas e combinam seqüências de caracteres com números inteiros (chaves e valores) e muito mais. Mas com relação à eficiência, o que eles oferecem? Qual é a diferença em ter um dictionary
vs um ArrayList
destructs(string,int)
fonte
Data Structures
Este link wiki pode ser de mais ajuda para vocêRespostas:
Você precisa cavar um pouco para ver como o Dicionário é implementado em C # - não é tão óbvio quanto o HashMap (uma tabela de hash) ou o TreeMap (uma árvore classificada) (ou ConcurrentSkipListMap - uma lista de ignorados ).
Se você se aprofundar na seção "Comentários":
E aí temos que. É uma tabela de hash . Observe que eu vinculei o artigo da Wikipedia lá - é uma leitura bastante boa. Você pode ler a seção sobre resolução de colisão. É possível obter um conjunto de dados patológicos em que a pesquisa retorne para O (N) (por exemplo, tudo o que você insere cai no mesmo valor ou índice de hash na tabela de hash por algum motivo e fica com a verificação linear ).
Embora o Dictionary seja uma solução de uso geral, você não deve usar tipos concretos (como o Dictionary) - você deve usar as interfaces. Nesse caso, essa interface é
IDictionary
( docs ). Para isso, você é perfeitamente capaz de escrever sua própria implementação de dicionário que faz as coisas da melhor maneira possível para os dados que você possui.Quanto à eficiência de várias pesquisas / contém?
Para a maioria das pessoas, a tabela de hash é o que elas desejam.
Você pode achar que o SortedDictionary é o que você deseja:
Porém, novamente, se a estrutura de dados não é aquela que funciona idealmente com seus dados, você recebe as ferramentas (as interfaces) para poder escrever uma que funcione melhor para seus dados.
O dicionário em si é um tipo de dados abstrato . Você me fornece um dicionário e eu sei o que posso fazer com ele e todas as ferramentas existentes para que eu possa usar pela natureza de ser um dicionário. Se você me desse uma ArrayList, eu me veria escrevendo meu próprio código para pesquisar, inserir ou excluir itens da lista. Isso desperdiça meu tempo e também significa que há mais chances de ocorrer um erro, pois copio o código repetidamente de um local para outro.
fonte