Question

Ci-dessous mon code pseudo.

function highest(i, j, k)
{
  if(i > j && i > k)
  {
    return i;
  }
  else if (j > k)
  {
    return j;
  }
  else
  {
    return k;
  }
}

Je pense que les travaux, mais est-ce que la façon la plus efficace en C ++?

Était-ce utile?

La solution

Pour le plus grand que vous devez regarder exactement 3 ints, ni plus ni moins. Vous cherchez à 6 avec 3 compare. Vous devriez être en mesure de le faire en 3 et 2 compare.

int ret = max(i,j);
ret = max(ret, k);
return ret;

Autres conseils

pseudocode:

result = i
if j > result:
  result = j
if k > result:
  result = k
return result

Qu'en est-

return i > j? (i > k? i: k): (j > k? j: k);

deux comparaisons, aucune utilisation de variables de pile temporaire transitoires ...

Votre méthode actuelle: http://ideone.com/JZEqZTlj (0.40s)

La solution de Chris:

int ret = max(i,j);
ret = max(ret, k);
return ret;

http://ideone.com/hlnl7QZX (0.39s)

Solution par Ignacio Vazquez-Abrams:

result = i;
if (j > result)
  result = j;
if (k > result)
  result = k;
return result;

http://ideone.com/JKbtkgXi (0.40s)

Et de Charles Bretana:

return i > j? (i > k? i: k): (j > k? j: k);

http://ideone.com/kyl0SpUZ (0.40s)

de ces tests, toutes les solutions prennent à moins de 3% la quantité de temps pour exécuter les autres. Le code que vous essayez d'optimiser est extrêmement court car il est. Même si vous êtes en mesure de presser 1 instruction hors de lui, il est peu probable de faire une énorme différence dans l'ensemble de votre programme (compilateurs modernes pourraient attraper cette petite optimisation). Passez votre temps ailleurs.

EDIT: Mise à jour des essais, il a été se révèle encore l'optimisation des parties de celui-ci avant. Espérons que ce n'est pas plus.

Pour une question comme ça, il n'y a pas de substitut à savoir exactement ce que votre compilateur d'optimisation fait et tout ce qui est disponible sur le matériel . Si l'outil fondamental que vous avez est la comparaison binaire ou max binaire, deux comparaisons ou max de la fois nécessaires et suffisantes.

Je préfère la solution de Ignacio:

result = i;
if (j > result)
  result = j;
if (k > result)
  result = k;
return result;

parce que sur le matériel Intel moderne commun, le compilateur trouve qu'il est extrêmement facile d'émettre seulement deux comparaisons et deux instructions de cmov, qui placent une plus petite charge sur la I-cache et moins de stress sur le prédicteur de branche que les branches conditionnelles. (En outre, le code est clair et facile à lire.) Si vous utilisez x86-64, le compilateur même garder tout dans les registres.

Notez que vous allez être pressé difficile d'intégrer ce code dans un programme où votre choix fait une différence ...

Je tiens à éliminer les sauts conditionnels comme un exercice intellectuel. Que cela a un effet mesurable sur les performances je ne sais pas si:)

#include <iostream>
#include <limits>

inline int max(int a, int b)
{
    int difference = a - b;
    int b_greater = difference >> std::numeric_limits<int>::digits;
    return a - (difference & b_greater);
}

int max(int a, int b, int c)
{
    return max(max(a, b), c);
}

int main()
{
    std::cout << max(1, 2, 3) << std::endl;
    std::cout << max(1, 3, 2) << std::endl;
    std::cout << max(2, 1, 3) << std::endl;
    std::cout << max(2, 3, 1) << std::endl;
    std::cout << max(3, 1, 2) << std::endl;
    std::cout << max(3, 2, 1) << std::endl;
}

Ce bit bidouilles est juste pour le plaisir, la solution de cmov est probablement beaucoup plus rapide.

Je ne sais pas si cela est le plus efficace ou non, mais il est peut-être, et il est certainement plus court:

int maximum = max( max(i, j), k);

Il est proposé d'inclure cela dans la bibliothèque C de sous N2485. La proposition est simple, donc je l'ai inclus le code significatif ci-dessous. De toute évidence, cela suppose des modèles variadique

template < typename T >
const T & max ( const T & a )
{ return a ; }

template < typename T , typename ... Args >
const T & max( const T & a , const T & b , const Args &... args )
{ return  max ( b > a ? b : a , args ...); }
public int maximum(int a,int b,int c){
    int max = a;
    if(b>max)
        max = b;
    if(c>max)
        max = c;
    return max;
}

Je pense que par « le plus efficace », vous parlez de la performance, en essayant de ne pas gaspiller les ressources informatiques. Mais vous pouvez faire référence à l'écriture moins de lignes de code ou peut-être au sujet de la lisibilité de votre code source. Je suis un exemple ci-dessous fournirai, et vous pouvez évaluer si vous trouvez quelque chose d'utile ou si vous préférez une autre version des réponses que vous avez reçues.

/* Java version, whose syntax is very similar to C++. Call this program "LargestOfThreeNumbers.java" */
class LargestOfThreeNumbers{
    public static void main(String args[]){
        int x, y, z, largest;
        x = 1;
        y = 2;
        z = 3;
        largest = x;
        if(y > x){
            largest = y;
            if(z > y){
                largest = z;
            }
        }else if(z > x){
            largest = z;
        }
        System.out.println("The largest number is: " + largest);
    }
}
#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    scanf("%d %d %d",&a,&b,&c);
    d=(a+b+abs(a-b))/2;
    e=(d+c+abs(c-d))/2;
    printf("%d is Max\n",e);
    return 0;
}

Le plus grand de 3 numéros

int greater = a>b ? (a>c? a:c) :(b>c ? b:c); 
System.out.println(greater);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top