2015-09-17 1 views
-1

qui est une meilleure façon d'écrire un programme pour trouver le maximum de 4 no.s en C/C++:Quelle est la meilleure façon de trouver le maximum de no.s?

  1. en utilisant un cinquième & variables comparant à toutes les entrées
  2. en utilisant la fonction max()
  3. et en comparant les entrées à l'aide si

ou suggérer une autre, si elle a une meilleure approche (en termes d'espace & complexité temporelle) de résoudre le problème

La même approche algorithmique serait-elle toujours la meilleure dans le cas de plus de 4 variables?

+2

Si vous savez qu'il s'agit de quatre entrées, le plus petit nombre de comparaisons est 'max (max (a, b), max (c, d))'. – rlbond

+0

les comparaisons seraient peu nombreuses, mais l'espace - en termes de la fonction max() appelée à plusieurs reprises ne serait-il pas plus? – dj1

+0

@rlbond: Hein? 'max (a, max (b, max (c, d)))' a le même nombre de comparaisons. Il a juste une chaîne de dépendance plus longue. – EOF

Répondre

2

Pour un grand nombre d'éléments, la bibliothèque standard a l'algorithme std::max_element qui fait max(N-1, 0) comparaisons pour N éléments, son le minimum théorique , même pour 4 éléments.

En pratique, il boucle sur tous les éléments comme le fait votre méthode 1., mais il pourrait faire un "tournoi d'élimination" de max imbriqué si N est une puissance de 2 (votre méthode 2). Certains compilateurs d'optimisation pourraient même dérouler la boucle et produire une chaîne complexe de if instructions (votre méthode 3).

Dans les commentaires, la solution de style C++ 11 max({a,b,c,d}) a été fournie par @NathanOliver (qui ne fonctionne que dans les contextes). Mais en C++ 1z, le std::max_element deviendra également constexpr de sorte que ce sera la solution complète, petite ou grande, à l'exécution ou à la compilation.

TL; DR: ne pas trop penser à cela, utilisez la bibliothèque standard qui ne nécessite qu'une quantité minimale de travail.

0

Mieux vaut un terme perdu. Comme indiqué dans les commentaires

max(max(a,b), max(c,d)); 

est très concis mais il y a 3 appels de fonction. Il est légèrement plus rapide du code sage, mais beaucoup plus de codage pour écrire quelque chose comme:

if (a>b) 
{ 
    if (a>c) 
    { 
    if (a>d) 
    { 
     return (a); 
    } 
    } 
} 

if (b>a) 
{ 
    if (b>c) 
    { 
    if (b>d) 
    { 
     return (b); 
    } 
    } 
} 
if (c>a) 
{ 
    if (c>b) 
    { 
    if (c>d) 
    { 
     return (c); 
    } 
    } 
} 

if (d>a) 
{ 
    if (d>b) 
    { 
    if (d>c) 
    { 
     return (d); 
    } 
    } 
} 
+1

' std :: max ({a, b, c, d}) ' – NathanOliver

+2

' max' est couramment implémenté en tant que macro, et même s'il ne l'est pas, il est probablement incrusté par les compilateurs modernes. – EOF

+0

Ce code peut faire plus de deux fois plus de comparaisons que 'std :: max' et pour certaines valeurs ce code n'atteindra aucune des instructions' return'. Utilisez juste 'std :: max' sauf si le profilage montre que c'est un goulot d'étranglement (et ce n'est probablement pas le cas). – Blastfurnace