DEV Community

Cover image for HashSet pra quem sabe o que é uma List no C#
Vitor Norton
Vitor Norton

Posted on • Originally published at vtnorton.com

HashSet pra quem sabe o que é uma List no C#

Tanto o HashSet quanto o List são estruturas de dados em C# que permitem armazenar uma coleção de elementos. No entanto, há diferenças importantes entre eles.

O List é uma lista ordenada de elementos, onde cada elemento é acessado por um índice numérico. O List permite elementos duplicados e mantém a ordem dos elementos adicionados.

Por outro lado, o HashSet é uma coleção de elementos não ordenados e não permite elementos duplicados. O HashSet usa um algoritmo de hashing para armazenar e recuperar elementos, o que torna a verificação da presença de um elemento muito rápida em comparação com o List.

Pense na situação em que você precisa encontrar o primeiro número duplicado em um array, onde o índice da segunda ocorrência desse número seja o menor possível. Nesse caso, o uso do HashSet pode ser especialmente útil.

Considere o seguinte exercício: dado um array a que contém apenas números no intervalo de 1 a a.length, devemos encontrar o primeiro número duplicado para o qual a segunda ocorrência tem o índice mínimo. Em outras palavras, se houver mais de um número duplicado, devemos retornar o número cuja segunda ocorrência tem um índice menor do que a segunda ocorrência dos outros números duplicados. Caso não haja elementos que satisfaçam essa condição, o valor retornado será -1.

Imagine que temos o seguinte array:

int[] a = {2, 3, 1, 5, 2, 4, 3};
Enter fullscreen mode Exit fullscreen mode

Nesse caso, o número 2 é o primeiro número duplicado, pois aparece nas posições 0 e 4 do array. A segunda ocorrência do número 2 ocorre na posição 4, que é menor do que a segunda ocorrência dos outros números duplicados (o número 3 aparece nas posições 1 e 6, e o número 5 aparece apenas na posição 3).

Para resolver esse problema, podemos utilizar um HashSet para armazenar os números que encontramos durante a iteração pelo array. Ao percorrer o array, podemos verificar se cada número já existe no HashSet. Se já existir, encontramos o primeiro número duplicado e podemos retorná-lo. Caso contrário, adicionamos o número ao HashSet e continuamos a iteração.

Por isso, no exemplo apresentado, usamos um HashSet para implementar a solução.

int FindFirstDuplicate(int[] array)
{
    HashSet<int> numbers = new HashSet<int>();

    foreach (int num in array)
    {
        if (numbers.Contains(num))
        {
            return num;
        }

        numbers.Add(num);
    }

    return -1;
}
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, criamos um HashSet chamado numbers para armazenar os números encontrados. Em seguida, percorremos o array utilizando um loop foreach e verificamos se cada número já existe no HashSet. Se já existir, retornamos o número duplicado. Caso contrário, adicionamos o número ao HashSet e continuamos a iteração.

Usar um List exigiria percorrer todo o List para verificar se cada elemento já foi adicionado anteriormente, o que levaria O(n²) tempo no pior caso.

Por outro lado, usar um HashSet permite verificar rapidamente se um elemento já foi adicionado anteriormente, em O(1) tempo no melhor caso. Como o HashSet não permite elementos duplicados, o primeiro elemento duplicado que encontrarmos será a duplicata que procuramos.

Top comments (0)