Je me demande quelle est la meilleure façon de trouver les valeurs min et max dans un tableau. J'utilise deux approches (mon tableau est a avec une taille size ):
Approche 1:
int min = a[0], max = a[0];
for(int i = 1; i < size; i++)
{
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
Approche 2:
int min = INT_MAX, max = INT_MIN;
for(int i = 0; i < size; i++)
{
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
Approche 3:
int min = 0, max = 0;
for(int i = 0; i < size; i++)
{
if(a[i] > max || i == 0) max = a[i];
if(a[i] < min || i == 0) min = a[i];
}
L'approche 2 semble un peu plus optimale à mon œil novice (nous ne Je n'ai pas à évaluer i == 0 2 fois chaque itération de boucle. Cependant, je crains que jouer avec ces valeurs limites puisse mal tourner. Ceci est résolu dans l'approche 3, cependant. Ce qui est le plus optimal des trois et pourquoi?
Merci pour toutes les réponses!
3 Réponses :
Les 2e et 3e approches sont de meilleures approches. Personnellement, je pense que la troisième est une meilleure solution que la deuxième.
signifie optimal, en commençant par la valeur initiale du tableau, c'est bien ce que je veux dire
Il n'y a pas de "plus optimal". Quelque chose est «optimal» ou non. Il n'y a rien de mieux que «optimal» donc rien ne peut être «plus optimal». ... c'est ce que @DavideSpataro a essayé de vous dire.
Oui, désolé, je devrais utiliser le mot approprié. c'est une meilleure façon de faire, pas plus optimale. est-ce bien?
Essayez de choisir la troisième option. C'est plus optimal et vous n'avez pas à vous soucier des valeurs limites.
L'approche 1 convient à tous les cas, donc si vous écrivez du code sans tenir compte du contexte particulier, je l'utiliserais.
L'approche 2 dépend du type de variable. Si vous le changez de int32 à n'importe quoi, vous devrez réécrire le programme. Et btw pour les types non signés 0 est la valeur minimale et aucune constante spéciale ne peut être définie.
L'approche 3 nécessite que votre séquence (tableau) ne soit pas vide et ne puisse pas être utilisée sans longueur supplémentaire -vérification.
J'aime cette modification de l'approche 3:
// assuming size is of size_t and can't be negative
int min = size ? a[0] : 0;
int max = min;
for(int i = 1; i < size; i++)
{
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
Je suis vraiment surpris de voir des gens penser que l'approche 1 ne fonctionnera pas sur les nombres négatifs. Cela le fera car à la première itération, lorsque i == 0 est coché, nous initialisons toujours min et max avec premier élément. En cas de doute, je recommande d'exécuter ce code sur une séquence négative - cela fonctionne (j'ai vérifié)
Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été a été déplacé vers le chat .
# 3 est la voie à suivre.
J'aime beaucoup le fait que vous pensiez à ne répéter qu'une seule fois, bien fait, je vais en prendre 2 ou 3
@Cid
maxetminne seront pas indéfinis, je les définit comme 0 avant la boucle, mais comme vous le dites - pouri == 0 code> conditiona [i]> maxne sera pas vérifiée.Cela semble plus une question de révision de code avec un aspect d'optimisation. «basé sur l'opinion» semble la raison de vote serré la plus proche.
L'approche 3 peut être améliorée avec
if (a [i] -> else if (a [i]L'approche 3 est erronée lorsque
size == 0car elle a un comportement non défini. (Ne s'applique cependant pas à un tableau , mais à la mémoire allouée.)