Questão nº 30
Questão de Tecnologia da Informação · FGV CVM 2024 (nº 30)
Para acelerar a busca sobre uma lista de mensagens, Beatriz adotou uma tabela de dispersão, na qual o e-mail do emissor é quem define o hash.
```
N: INTEIRO
V: VETOR [0..N-1] de LISTA<MENSAGEM>
Algoritmo Adicionar (M: MENSAGEM)
H <- 0
Para i de 0 até Tamanho (M.email) - 1
H <- H + Ord (M.email[i])
Fim Para
H <- H Mod N
V[H].Incluir(M)
Fim Algoritmo
```
O hash é dado pelo resto da divisão entre a soma dos códigos ASCII do email e o tamanho do vetor de listas.
Para que Beatriz obtenha a melhor distribuição das mensagens nas listas:
- Ao valor dos códigos ASCII, obtidos pela função Ord, deve ser multiplicado por N;
- Ba soma dos códigos ASCII deve ser feita do final para o início do campo email de M;
- Co número N deve ser primo; (alternativa correta)
- Da mensagem M deve ser incluída na lista da posição N – H do vetor V;
- Eo número N precisa ser par.
Resposta comentada
Gabarito Alternativa C
Uma tabela hash é uma estrutura de dados que usa uma função hash para transformar uma chave (como um e-mail) em um índice numérico, permitindo acesso rápido aos dados. Para que funcione bem, a função hash deve distribuir as chaves de forma uniforme pelo vetor de listas, minimizando colisões (quando chaves diferentes geram o mesmo índice).
- (A) Incorreta: Multiplicar os códigos ASCII por
Nantes de somar e aplicar o móduloNfaria com que a somaHfosse um múltiplo deNem muitos casos. SeHé múltiplo deN,H Mod Nserá sempre0, resultando em uma péssima distribuição, onde todas as mensagens iriam para a primeira lista. - (B) Incorreta: A soma é uma operação comutativa; a ordem em que os códigos ASCII são somados (do início para o fim ou do fim para o início) não altera o valor final da soma
H. Consequentemente, o resultado deH Mod Ne a distribuição não seriam afetados. - (C) Correta: Para funções hash que utilizam o operador módulo (
Mod N), escolher umN(o tamanho do vetor de listas) que seja um número primo é uma prática comum e eficaz. Isso ajuda a garantir uma distribuição mais uniforme dos valores de hash pelos índices do vetor, pois um número primo tem menos fatores em comum com outros números, o que reduz a probabilidade de padrões nos dados de entrada causarem colisões frequentes e concentradas. - (D) Incorreta: Incluir a mensagem na posição
N – H(ondeHjá éH Mod N) poderia, por exemplo, resultar emNseHfosse0, o que seria um índice fora dos limites do vetorV(0aN-1). Mesmo se ajustado para(N - H) Mod N, essa alteração na fórmula do índice não resolve o problema fundamental da distribuição, que depende mais da escolha deNe da qualidade da somaH. - (E) Incorreta: Um
Npar é geralmente uma escolha ruim para o tamanho de uma tabela hash. SeNfor par e a soma dos códigos ASCII (H) tender a ser par (o que é comum, já que muitos códigos ASCII são pares), entãoH Mod Nsempre resultará em um número par. Isso significaria que todas as mensagens seriam armazenadas apenas nas posições pares do vetorV, deixando metade das listas (as de índice ímpar) completamente vazias e concentrando as colisões nas posições pares. Armadilha: Esta alternativa tenta induzir ao erro, sugerindo que um número "simétrico" ou "redondo" como um par seria bom, quando na verdade é o oposto do que se busca para uma boa distribuição em funções de hash com módulo.
Fonte: FGV CVM 2024 Analista CVM - TI Sistemas e Desenvolvimento (Perfil 8) (Caderno Tipo 1). Reproduzida para fins de estudo.