Die meisten effizienten Art und Weise zu finden, die größte der drei ints
Unten ist mein pseudo-code.
function highest(i, j, k)
{
if(i > j && i > k)
{
return i;
}
else if (j > k)
{
return j;
}
else
{
return k;
}
}
Ich denke, das funktioniert, aber ist, dass der effizienteste Weg, in C++?
- ist dieses Hausaufgaben?
- Konnte verwenden Sie diese überhaupt? cplusplus.com/reference/algorithm/max
- In diesem Fall, wenn es Hausaufgaben, es ist OK, da der Fragesteller hat den Versuch gemacht, seinen code angezeigt und bittet um Verbesserung. Erfüllt alle Richtlinien zum posten der Hausaufgaben Fragen auf ALSO.
- Robert Greiner, ha, ha, Nein. aber es wäre ein großer Hausaufgaben-Frage, nicht?
- Das ist mehr eine Frage des effizienten. Ich weiß, das wird mir die richtige Antwort, aber als Programmierer, wie kann ich weiß, ich mache es schnell und effizient?
- Nie sagte, es war nicht eine berechtigte Frage.
- Ihr Profil-Sie bestimmen, ob es ist die wichtigste slow-down in Ihrem Programm. Es ist ein allgemeiner Fehler, der dir über die Effizienz der alles; nur den code leicht zu verstehen und einfach zu schreiben, und lassen Sie den compiler zu tun, es ist Teil.
- Hier ist die effizienteste Art und Weise möglich:
/* Precondition: i is the largest value of the three. */ int max(int i, int j, int k) { return i; }
oder vielleicht nur zurück, 42. - guter Punkt. ich denke, ich bin nur in der Hoffnung auf eine bessere mathematische Programmierer. ich bin wahrscheinlich einfach meine mangelnde Mathematik-Unterricht 😉 .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu finden, die größte, die Sie benötigen, zu betrachten, genau 3 ints, nicht mehr und nicht weniger. Sie suchen in 6 mit 3 vergleicht. Sie sollten in der Lage sein, es zu tun in 3 und 2 vergleicht.
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))
speichert Sie auf einer Linie. Ich mag die version der Vorlage zumax
ist ein makro oder eine inline-Funktion,max(i, max(j, k))
wird zu erweitern, um etwas entlang der Linien voni > ( j > k ? j : k ) ? i : ( j > k ? j : k )
(CSE Optimierung abweichend), und falls nicht, haben Sie die function-call overhead. Wir reden Programmierer, der Effizienz oder der rechnerische Effizienz?max
ist in der hardware zu den gleichen Kosten wie ein Vergleich. Welche Maschine verwenden Sie?rv1 = j > k ? j : k; rv2 = i > rv1 ? i : rv1; return rv2;
das ist das gleiche nur mit CSE. Habe ich etwas verpasst? Vielleicht Dinge haben sich geändert in den 2 Jahrzehnten, seit ich das Letzte mal gestört Suche im generierten Assembler-Sprache. Ich habe nichts gesagt, ich bin falsch, obwohl ich lieber gesagt, warum 🙂std::max
und werden mit ihm durch. @Chris: GNU-STL definiert median als private Funktion, vielleicht ist das, was Sie denken.Pseudocode:
cmov
, wird der compiler Sie verwenden. +1 (ich wünschte, ich könnte +10 vorbei an der bösenmax
)Wie etwa
zwei Vergleiche, kein Einsatz von transient temporären stack-Variablen...
#define
. ^_^Deine aktuelle Methode:
http://ideone.com/JZEqZTlj (0.40 s)
Chris ' s Lösung:
http://ideone.com/hlnl7QZX (0.39 s)
Lösung von Ignacio Vazquez-Abrams:
http://ideone.com/JKbtkgXi (0.40 s)
Charles Bretana s:
http://ideone.com/kyl0SpUZ (0.40 s)
Tests, alle Lösungen sind innerhalb von 3% der Höhe der Zeit zu führen als die anderen. Der code, den Sie versuchen zu optimieren sind extrem kurz, wie es ist. Auch wenn Sie sind in der Lage, squeeze 1 Anleitung aus, ist es wahrscheinlich nicht machen einen großen Unterschied über die Gesamtheit des Programms (Compilern fangen könnte, dass kleine Optimierung). Verbringen Sie Ihre Zeit an anderer Stelle.
EDIT: Aktualisiert den tests stellt sich heraus, es war immer noch die Optimierung von teilen davon vor. Hoffentlich ist es nicht mehr.
Für eine Frage wie diese, es gibt keinen Ersatz für wissen, genau das, was Ihre optimierende compiler tut, und nur das, was auf der verfügbaren hardware. Wenn das grundlegende Werkzeug, das Sie haben ist binären Vergleich oder Binär max, zwei Vergleiche oder max sind beide notwendig und ausreichend.
Ich lieber Ignacio Lösung:
weil auf der gemeinsamen moderner Intel-hardware, der compiler findet es extrem einfach zu emittieren nur zwei Vergleiche und zwei
cmov
Anweisungen, die ein kleiner laden auf dem I-cache und weniger stress auf der branch-predictor-als bedingten Verzweigungen. (Auch der code ist klar und leicht zu Lesen.) Wenn Sie x86-64, der compiler wird auch alles registriert.Hinweis: Sie werden hart gedrückt, um das einbetten dieses Codes in eine Programm, wo Sie Ihre Wahl einen Unterschied macht...
Ich gerne beseitigen bedingte Sprünge als eine Intellektuelle übung. Ob das hat keine messbare Auswirkung auf die performance habe ich keine Idee, obwohl 🙂
Dieses bit twiddling ist einfach nur zum Spaß, die
cmov
Lösung ist wahrscheinlich viel schneller.Nicht sicher, ob dies die effizienteste ist oder nicht, aber es könnte sein, und es ist definitiv kürzer:
Es ist ein Vorschlag, um diese in die C++ - Bibliothek unter N2485. Der Vorschlag ist einfach, also ich habe den sinnvollen code. Natürlich, dies setzt Voraus, variadic templates
Ich denke, durch die "effizienteste" Sie sprechen über Leistung, versuchte, nicht zu verschwenden computing-Ressourcen. Aber Sie konnte sich auf das schreiben weniger code-Zeilen oder vielleicht über die Lesbarkeit des Quellcodes. Ich bin ein Beispiel unter, und können Sie auswerten, wenn Sie etwas finden, nützlich, oder wenn Sie lieber eine andere version von den Antworten, die Sie erhalten.
Größte von 3 zahlen