2010-01-19 12 views
0

Mon professeur nous a demandé de tester la différence entre les temps d'exécution et les tailles de recherche en utilisant des algorithmes binaires linéaires &, et les données doivent être représentées graphiquement.Conversion de nombres aléatoires en coordonnées XY pour la représentation graphique

J'ai les méthodes de recherche mis les tailles de tableau & runtime en tant que points dans un ArrayList, qui est ensuite envoyé à la classe GraphResults pour le traçage. J'ai besoin de convertir ces points de données en coordonnées xy avant. La taille de la recherche est l'axe des x et l'exécution est l'axe des y

Comme les tailles de recherche sont fixées en multiple de 128 et il n'y a que 8 tailles, j'ai utilisé le commutateur pour calculer la valeur de x, mais je cherche un moyen plus efficace de convertir les runtimes en coordonnées.

En ce moment, je suis en utilisant avec 5 conditions imbriquées comme ceci:

if (y<=1000) { 
    if (y<= 500) { 
     if (y<= 250) { 
      newy= yaxis-32; }//equals to 250ms category 
     else { 
      newy= yaxis-(32*2); }//500ms category 
    } 
else if (y<=750) { 
    newy= yaxis-(32*3);} //750ms category 
else { 
    newy= yaxis-(32*4);} //1000ms category 
} //end of the 1000ms tests 

En ce moment, les chiffres qui sont plus 5000ms nécessitent 7 tests. Existe-t-il un moyen plus efficace d'attribuer un nombre en fonction de la taille d'un nombre?

Répondre

2

Lorsque vous essayez de déterminer la plage de mesure, vous pouvez diviser la quantité par la taille de la plage, puis calculer le nombre que vous souhaitez afficher dans le graphique. Btw, dans votre code, vous avez fait une erreur de logique, si la valeur est y <= 1000 la première condition évalue à vrai, et la seconde pour y <= 750 ne sera jamais évaluée.

Il semble également que plus la plage de valeurs est élevée, plus le point de votre graphique est bas. Est-ce que c'est comme prévu? (1000 -> ymax - 128 en 1 -> ymax - 32)

En aparté, si vous voulez comparer les valeurs des gammes inégales, vous pouvez aussi faire quelque chose comme une recherche de tableau (pseudo code):

int[] ranges = new int { 50, 500, 5000, 50000 }; 

for (int n = 0; n < ranges.length && value > ranges[n]; n++) { 
} 

int range = n; 
int newy = yaxis - range * 32; 

Notez que l'indice hors plage agit comme la plage trouvée pour une valeur supérieure à la plus grande valeur de votre tableau.

+0

La bibliothèque graphique que j'utilise est fournie avec le manuel de classe. Il ressemble beaucoup à l'objet Tortue, seulement plus convivial, et il affiche les coordonnées x-y du curseur sur l'écran. Très utile pour déterminer où mettre les choses. Le seul inconvénient est que les coordonnées (0,0) sont en haut à gauche de la fenêtre, donc c'est pourquoi les valeurs semblent faussées – Jason

1

Que diriez-vous newy = yaxis - 32 * ((y/250)% 8);?

+0

Pour y <250, cela donnerait newy = yaxis. – wtaniguchi

+0

Cela ressemble à ça va marcher, et ont des tests à faire. Merci! – Jason

1

Je reformater votre code à quelque chose comme ceci:

newy = yaxis - 32 * ((y-1)/250 + 1); 

De cette façon, vous calculez le multiplicateur plutôt que de choisir manuellement.

+0

est-ce vraiment un coup sur le point de vue de l'efficacité? Comme il y a <20 points sur l'axe des y, il a fallu moins de 3 minutes pour que les multiplicateurs soient mis en place. – Jason

+0

Je ne suis pas sûr de comprendre ce que vous demandez ici. Les avantages de cette ligne par rapport aux instructions if imbriquées sont que cela s'adapte à n'importe quel nombre de points sur l'axe y et qu'il faut moins de cycles pour calculer. – Aaron