Quel est le moyen le plus efficace de trouver la taille de l'intersection de deux ensembles non épars en Java ? Il s'agit d'une opération que je vais appeler sur de grands ensembles un très grand nombre de fois, l'optimisation est donc importante. Je ne peux pas modifier les ensembles originaux.
J'ai examiné Apache Commons CollectionUtils.intersection qui semble être assez lent. Mon approche actuelle consiste à prendre le plus petit des deux ensembles, à le cloner, puis à appeler .retainAll sur le plus grand des deux ensembles.
public static int getIntersection(Set<Long> set1, Set<Long> set2) {
boolean set1IsLarger = set1.size() > set2.size();
Set<Long> cloneSet = new HashSet<Long>(set1IsLarger ? set2 : set1);
cloneSet.retainAll(set1IsLarger ? set1 : set2);
return cloneSet.size();
}
0 votes
Pour autant que je sache, CollectionUtils.Intersection est une méthode plus générale (qui peut être appliquée aux listes également), c'est pourquoi elle ne brille pas sur les ensembles. Et vous devriez vérifier : stackoverflow.com/questions/2851938/
2 votes
Quel est le
size()
d'un booléen ? :-)0 votes
Cela serait peut-être un peu plus rapide (micro-optimisation extrême) en faisant une seule déclaration if au lieu des trois
?:
déclarations. Ainsi, il ne doit effectuer qu'un seul branchement (qui peut être "coûteux") au lieu de trois.0 votes
J'ai testé avec les deux et je n'ai pas pu voir de différence - peut-être que le compilateur ou le runtime s'en occupe pour moi.
0 votes
Sans aucune information sur le type de jeu dont nous parlons, il est difficile de répondre à cette question. Différents ensembles ont des coûts très différents pour différentes actions.
0 votes
Quelles sont les dimensions des ensembles que vous allez traiter ? Dans quelle fourchette se situent les valeurs ? Après avoir mis en place votre nouvelle implémentation, cette fonction est-elle toujours un point chaud ?