Francks11
Messages postés71Date d'inscriptionmardi 20 décembre 2005StatutMembreDernière intervention13 décembre 2008
-
13 déc. 2006 à 17:23
Francks11
Messages postés71Date d'inscriptionmardi 20 décembre 2005StatutMembreDernière intervention13 décembre 2008
-
14 déc. 2006 à 22:12
bonsoir,
voila je vous explique ce que je suis entrain de faire. Je dessine une zone sur une image et pour chaque point selectionné je recherche dans tous les vecteurs si il est déja présent. Mais en utilisant cette fonction ci dessous, quand jaffiche tous les points de la zone ca prend une éternité. Je voulais donc savoir comment je pourrais améliorer cet algorithme. (si je l'enleve les points sont la instantanément)
public boolean PointExist(Point p)
{
boolean b=false;
int p1;
int p2;
if(!this.contenu_label.isEmpty())
{
for(int i=0;i<this.contenu_label.size() && !b;i++)
{
//on extrait le Vector<Vector> de i
Vectorvext=(Vector)(this.contenu_label.get(i)).get(3);
Francks11
Messages postés71Date d'inscriptionmardi 20 décembre 2005StatutMembreDernière intervention13 décembre 2008 13 déc. 2006 à 21:31
j'ai testé la deuxieme fonction, c pas assez performant...
Je sais vraiment pas comment faire... peut être qu'il faudrait que je classe l'abscise en ordre croissant ou je sais pas trop...
Twinuts
Messages postés5375Date d'inscriptiondimanche 4 mai 2003StatutModérateurDernière intervention14 juin 2023111 13 déc. 2006 à 21:34
Salut,
le Vector est bien mais toutes ses méthodes sont synchronizé donc cela emplifie sont temps d'acces... appres faudrait voir ce que tu fais dans ton code pour aider à l'optimisation de celui-ci...
------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."
kaloway
Messages postés358Date d'inscriptionjeudi 24 octobre 2002StatutMembreDernière intervention13 avril 2020 13 déc. 2006 à 22:09
bonsoir voici quelque petit truc.
dnans ta boucle for(int i=0;i<this.contenu_label.size() && !b;i++) sort le "this.contenu_label.size()" et remplaces le par une variable. le !b devrait être testé avant la boucle for.
après ces modificaction la boucle for devient for(inti=0;i<variable;i++).
encore une dernière optimisation for(int i=variable;i=0;i++) au lieu de for(int i=0;i<variable;i++). le test du égale à zero est plus rapide que égale à une valeur.
est ce que tu peux récupèrer tes points sous forme de point2d. car la classe point2d a la méthode equals pour comparer 2 points. les méthodes de l'api sont souvent plus rapide que nos propres méthodes que nous créons.
Francks11
Messages postés71Date d'inscriptionmardi 20 décembre 2005StatutMembreDernière intervention13 décembre 2008 13 déc. 2006 à 22:10
sinon vous me proposerez quoi? faire une fonction récursive ou utiliser hash table? ou faire je sais pas quoi. Mais faudrait qui sache dans la seconde si tous les points existent ou pas...
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 13 déc. 2006 à 22:46
lol, une fonction récursive !!! Tu peux dire adieux aux performances là !
Pour traîter plus de 60 000 points en moins d'une seconde, tourne toi vers le HashTable !!! Ou ordonne tes points et stocke-les dans un tableau, avec un bon algorithme de recherche, tu peux arriver à trouver ton points en log n opérations (soit environ 11 opérations !, là seule chose, c'est d'avoir aussi un bon algo de tri (tri par insertion ou tri shell fortement déconseillé, utilise plutôt un tri de Dijkstra, ou un tri rapide). Mais ca va te faire une grosse algorithmique assez dure à utiliser (car avec un tableau tu perd tout les avantages de l'ajout d'un object dans un collection !).
Non franchement, passe par un HashTable, tu obtiendra les performances d'un tableau sans trop de prise de tête. Eclipse est fait pour faire du refactoring de code rapidement, profite en... ;)
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 déc. 2006 à 21:13
Une Hashtable est une collection hiérarchique composée de clés et de valeur. A une clé est associé une ou plusieurs valeurs.
L'utilisation la plus commune est d'utiliser une chaîne de caractère comme clé (pour un dictionnaire par exemple).
Ce que je te conseille de faire, c'est de mettre les coordonnées de ton point (+ d'autres propriétés si plusieurs points peuvent être aux mêmes coordonnées) en tant que chaîne de caractère pour la clé, et ton point en tant que valeur.
Pourquoi ? Je pense que le test d'égalité de la fonction contains se base sur l'adresse physique du point (méthode de comparaison classique de Java) et non sur le contenu de l'objet. Donc là si tu teste un point avec la coordonnée "1, 1" avec un point avec la même coordonnée, mais qui est un objet différent, la fonction contains te renverra false !
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 14 déc. 2006 à 21:14
Autre petite chose : utilise plutôt la fonction containsKey à la place de la fonction contains, elle est plus rapide car elle ne teste que les clés de ta table !