En résumé, je suis confus sur le fait que la complexité temporelle de vérifier si une chaîne existe dans un HashSet est O(1) ou O(m), m étant la longueur de la plus longue chaîne vérifiée.
Je comprends que le compartiment dans lequel la chaîne va être placée est déterminé par la méthode hashCode()
de la chaîne modulo la taille du HashSet. Cela signifie donc que pour savoir si une chaîne existe dans un HashSet, le hashCode doit être calculé.
Dans la méthode hashCode
de la classe String
, je vois que vous devez itérer sur toute la chaîne pour calculer cette valeur. Mais je vois aussi qu'il y a une option de mise en cache de cette valeur.
C'est là que je suis confus. Le hashCode d'une chaîne est-il mis en cache lors de la création d'une chaîne? Ou est-il mis en cache lorsque nous appelons explicitement la méthode hashcode
? L'appel implicite à la méthode hashCode
(comme dans le cas de la vérification de l'existence d'une chaîne dans un ensemble) met-il également en cache la valeur?
Quelle serait la complexité temporelle de la toute première vérification d'existence d'une chaîne dans HashSet?
Merci.
EDIT : Puisqu'il semble que je n'ai pas expliqué clairement ce que je demande : Je ne parle pas de la complexité temporelle si un chaînage se produit (ce qui se produirait en cas de collisions de hachage) / ou lorsque le Hash Set est redimensionné. Supposons pour l'instant qu'il n'y a pas de collisions dans le Hash Set. Par conséquent, la taille de chaque compartiment est au maximum de 1. Dans ce cas, si je vérifie si une chaîne est présente dans le Hash Set, cela prendra-t-il du temps O(1) ou O(m) (car la chaîne peut avoir O(m) caractères dans le pire des cas et le calcul du code de hachage requiert le parcours de toute la chaîne)?