HashSet<T> t = new HashSet<T>();
// add 10 million items
Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.
.Contains
Método de quem retornará mais rápido?
Só para esclarecer, meu requisito é que tenho 10 milhões de objetos (bem, strings, na verdade) que preciso verificar se eles existem na estrutura de dados. Eu NUNCA vou repetir.
.net
performance
dictionary
hashset
Halivingston
fonte
fonte
Respostas:
Teste de desempenho HashSet vs Lista vs Dicionário, obtido a partir daqui .
Adicione 1.000.000 de objetos (sem verificar duplicatas)
Contém cheque para metade dos objetos de uma coleção de 10.000
Remova metade dos objetos de uma coleção de 10.000
fonte
Suponho que você quer dizer
Dictionary<TKey, TValue>
no segundo caso?HashTable
é uma classe não genérica.Você deve escolher a coleção certa para o trabalho com base em suas necessidades reais. Você realmente deseja mapear cada chave para um valor? Se sim, use
Dictionary<,>
. Se você só se preocupa com ele como um conjunto, useHashSet<>
.Eu esperaria
HashSet<T>.Contains
eDictionary<TKey, TValue>.ContainsKey
(que são as operações comparáveis, supondo que você está usando seu dicionário de maneira sensata), basicamente executar o mesmo - eles estão usando o mesmo algoritmo, fundamentalmente. Eu acho que com as entradasDictionary<,>
sendo maiores, você acaba com uma probabilidade maior de expandir o cache doDictionary<,>
que comHashSet<>
, mas eu esperava que isso fosse insignificante em comparação com a dor de escolher o tipo de dados errado simplesmente em termos do que você está tentando alcançar.fonte
Dictionary
por outros motivos, deve usá-lo.Da documentação do MSDN para Dictionary <TKey, TValue>
Com uma nota:
Sei que sua pergunta / postagem é antiga - mas enquanto procurava uma resposta para uma pergunta semelhante, me deparei com isso.
Espero que isto ajude. Role para baixo até a seção Comentários para obter mais detalhes. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
fonte
Essas são estruturas de dados diferentes. Também não existe uma versão genérica do
HashTable
.HashSet
contém valores do tipo T queHashTable
(ouDictionary
) contém pares de valores-chave. Portanto, você deve escolher a coleta de dados que deseja armazenar.fonte
A resposta aceita para esta pergunta NÃO responde validamente à pergunta! Acontece que dá a resposta correta, mas essa resposta não é mostrada pelas evidências que eles forneceram.
O que essa resposta mostra é que as pesquisas de chave em a
Dictionary
ouHashSet
são muito mais rápidas do que pesquisar em aList
. O que é verdade, mas não é interessante, nem surpreendente, nem prova de que eles têm a mesma velocidade.Executei o código abaixo para comparar os tempos de pesquisa e minha conclusão é que eles SÃO, de fato, a mesma velocidade. (Ou pelo menos, se houver alguma diferença, então a diferença está bem dentro do Desvio Padrão dessa velocidade)
Especificamente, 100 milhões de pesquisas estavam levando entre 10 e 11,5 segundos para ambos, para mim, neste teste.
Código de teste:
fonte