Considérons une matrice de dimension Nx2
, où chaque ligne contient les limites inférieure et supérieure d'un PDF uniforme (c'est-à-dire, la fonction de densité de probabilité).Comment accélérer cet algorithme de comparaison d'objets?
Je veux compter le nombre de chevauchements, où un chevauchement est définie comme étant la condition dans laquelle deux des PDF se chevauchent, par exemple:
- PDF1:
[2,5]
- PDF2:
[3,6]
- Les deux Les fichiers PDF se chevauchent dans l'intervalle
[3,5]
.
Il est évident que, si trois fichiers PDF p1
, p2
et p3
se chevauchent, je compte trois chevauchements: p1
vs p2
, p1
contre p3
, p2
contre p3
.
J'ai créé le code suivant Matlab qui compte les chevauchements:
for m = 1:N-1
for k = m+1:N
l1 = dataService.getObjectCoordinate(m,1);
l2 = dataService.getObjectCoordinate(k,1);
u1 = dataService.getObjectCoordinate(m,2);
u2 = dataService.getObjectCoordinate(k,2);
if (l1 <= l2 && l2 <= u1) || (l2 <= l1 && l1 <= u2)
numOverlaps = numOverlaps + 1;
end
end
end
Cependant, comme vous pouvez l'imaginer, cela se passe comme O(N^2)
, qui est reeeeeally mal quand N
est grand. J'ai commencé l'exécution il y a trois heures avec N=10000
et il fonctionne toujours. Pouvez-vous suggérer un moyen de réduire la complexité de l'algorithme proposé, en excluant peut-être certaines des comparaisons a priori?
Merci d'avance.
@ MZimmerman6: La question à laquelle j'ai lié a au moins une réponse qui le fait dans O (N · logN). –
@RodyOldenhuis Ouais je viens de regarder ça, et j'écris du code pour le faire en moins ... je pense. Nous verrons comment cela se passe. Jusqu'à présent ce que j'ai est en cours d'exécution en moins d'une seconde – MZimmerman6