Le moyen le plus efficace de trouver le plus grand des trois entiers
Ci-dessous est mon pseudo code.
function highest(i, j, k)
{
if(i > j && i > k)
{
return i;
}
else if (j > k)
{
return j;
}
else
{
return k;
}
}
Je pense que ce qui fonctionne, mais est la façon la plus efficace en C++?
- est-ce devoirs?
- Pourriez-vous utiliser ce tout? cplusplus.com/reference/algorithm/max
- Dans ce cas, si c'est les devoirs, c'est OK, puisque l'interlocuteur a fait une tentative, montré son code et de la demande pour l'amélioration. Qui répond à toutes les lignes directrices pour l'affichage des devoirs des questions sur soi.
- Robert Greiner ha ha, non. bien qu'il ferait un excellent devoirs question, non?
- C'est plus une question d'efficacité. Je sais que cela va me donner la bonne réponse, mais en tant que programmeur, comment savoir si je vais le faire rapidement et efficacement?
- Jamais dit que ce n'était pas une question valable.
- Vous profil et de déterminer si elle est le principal ralentir dans votre programme. C'est une erreur commune à vous soucier de l'efficacité de tout; il suffit de rendre le code plus facile à comprendre et facile à écrire, et laisser le compilateur faire partie.
- Voici la façon la plus efficace possible:
/* Precondition: i is the largest value of the three. */ int max(int i, int j, int k) { return i; }
ou peut-être juste de retour de 42. - bon point. je suppose que je suis juste en espérant avoir une meilleure mathématique programmeur. je suis probablement juste pour mon manque de classes de mathématiques 😉 .
Vous devez vous connecter pour publier un commentaire.
De trouver le plus grand vous avez besoin de regarder exactement 3 ints, ni plus ni moins. Vous êtes à la recherche à 6 avec 3 compare. Vous devriez être en mesure de le faire en 3 et 2 compare.
template <typename T> const T& max(const T& pA, const T& pB, const T& pC){ return max(pA, max(pB, pC)); }
max(i, max(j, k))
l'enregistre sur une seule ligne. J'aime le modèle, en versionmax
est une macro ou une fonction en ligne,max(i, max(j, k))
va élargir à quelque chose le long des lignes dei > ( j > k ? j : k ) ? i : ( j > k ? j : k )
(CST optimisation nonobstant) et si elle n'est pas, vous avez d'appel de fonction, les frais généraux. Nous parlons de programmeur de l'efficience ou de l'efficacité de calcul?max
est intégré dans le matériel au même prix qu'une comparaison. Ce que la machine que vous utilisez?rv1 = j > k ? j : k; rv2 = i > rv1 ? i : rv1; return rv2;
qui est la même chose qu'avec le CST. Ai-je raté quelque chose? Peut-être que les choses ont changé dans les 2 décennies, depuis que je l'gêné en regardant généré langage d'assemblage. Je n'ai pas l'esprit dit que je me trompe, mais je préfère être dit pourquoi 🙂std::max
et être avec elle. @Chris: GNU STL définit médiane comme une fonction privée, peut-être que c'est ce que vous pensez de.Pseudocode:
cmov
, le compilateur va les utiliser. +1 (wish I could +10 dernières le malmax
)Comment sur
deux comparaisons, pas d'utilisation de transitoire temporaire de la pile des variables...
#define
. ^_^Votre méthode actuelle:
http://ideone.com/JZEqZTlj (0.40 s)
De Chris solution:
http://ideone.com/hlnl7QZX (0.39 s)
Solution par Ignacio Vazquez-Abrams:
http://ideone.com/JKbtkgXi (0.40 s)
Et Charles Bretana de l':
http://ideone.com/kyl0SpUZ (0.40 s)
De ces tests, toutes les solutions à moins de 3% de la quantité de temps pour s'exécuter que les autres. Le code que vous essayez d'optimiser est extrêmement court comme il est. Même si vous êtes capable de faire 1 instruction hors de lui, il n'est pas de nature à faire une énorme différence sur l'ensemble de votre programme (les compilateurs modernes peut attraper cette petite optimisation). Passer votre temps ailleurs.
EDIT: mis à Jour les tests, il s'avère que c'était encore l'optimisation des pièces de l'avant. J'espère que c'est pas plus.
Pour une question comme ça, il n'y a pas de substitut pour savoir tout ce que votre compilateur d'optimisation est en train de faire et qu'est-ce qui est offert sur le matériel. Si les fondamentaux de l'outil que vous avez est comparaison binaire ou binaire max, deux comparaisons ou max sont à la fois nécessaires et suffisantes.
Je préfère Ignacio solution:
parce que sur la commune moderne Intel, le compilateur va trouver qu'il est extrêmement facile d'émettre seulement deux comparaisons et deux
cmov
instructions, ce qui place une plus petite charge sur la I-cache et moins de stress sur la branche prédicteur de branchements conditionnels. (En outre, le code est clair et facile à lire.) Si vous utilisez x86-64, le compilateur va même le garder tout dans les registres.Note vous allez être mal à intégrer ce code dans un programme où votre choix fait la différence...
Je tiens à éliminer les sauts conditionnels comme un exercice intellectuel. Si cela a aucun effet mesurable sur la performance, je n'ai aucune idée de bien 🙂
Ce bit se tourner, c'est juste pour le fun, la
cmov
solution est probablement beaucoup plus rapide.Ne sais pas si c'est le plus efficace ou non, mais il pourrait être, et c'est certainement la plus courte:
Il y a une proposition visant à inclure dans la bibliothèque C++ sous N2485. La proposition est simple, donc, je ai inclus le code ci-dessous. Évidemment, cela suppose que les variadic templates
Je pense que par "les plus efficaces" vous parlez de la performance, en essayant de ne pas gaspiller les ressources de calcul. Mais vous pourriez être en se référant à l'écriture de moins de lignes de code ou peut-être sur la lisibilité de votre code source. Je suis en fournissant un exemple ci-dessous, et vous pouvez évaluer si vous trouverez quelque chose d'utile ou si vous préférez une autre version à partir des réponses que vous avez reçu.
Plus de 3 numéros