Ich versuche, eine C ++ - Zuweisung zu verbessern, um sie effizienter zu machen. Ich bin ein Anfänger mit der Sprache (und Programmierung im Allgemeinen auch), also verwende ich nur das, was ich bis jetzt weiß (wenn, sonst). Ich habe eine Funktion, die Scores in Level konvertiert, also alles unter 30 = 1, 30-49 = 2, 50-79 = 3 und so weiter ...
Hier mache ich es so:
%Vor%Gibt es einen besseren Weg dies zu tun, da ich weiß, dass dies eine neue Zeile für jede einzelne Punktzahl erfordert, die ich habe.
Das hängt eher davon ab, was Sie unter Effizienz verstehen. Sie können die Grenzwerte für jede Ebene in einem Array beibehalten
%Vor%... oder so ähnlich.
Zuerst den Code für die Berechnung der Ebene in eine separate Funktion ausschließen, sagen wir get_level:
%Vor%Sie können get_level auf verschiedene Arten implementieren.
Wenn die Anzahl der Ebenen klein ist, können Sie die lineare Suche verwenden:
%Vor%Oder, wenn Sie ein STL-Fan sind:
%Vor%Wenn Sie viele Ebenen haben, kann die binäre Suche geeigneter sein:
%Vor%Oder wenn Sie eine relativ kleine Anzahl von Ebenen haben, dann verwenden Sie die if-else-Kette ähnlich Ihrer ursprünglichen Version:
%Vor%Beachten Sie, dass durch das Einfügen von Returns in separaten Zeilen Ihr Programm im Debugger leichter verfolgt werden kann.
Nein, in puncto Effizienz ist es bereits optimiert.
Zu einer anderen stilistischen Note. Ich würde empfehlen, die Bedingungen und Aussagen auf separate Zeilen zu setzen:
%Vor%und wie die andere Antwort nahe legt, wäre ein weiteres stilistisches Plus, das übliche Verhalten in eine Funktion zu extrahieren
Der absolut schnellste Weg:
Erstellen Sie ein Array mit 80 Werten, eines für jede mögliche Punktzahl. Füllen Sie das Array mit dem Level für jede mögliche Punktzahl.
Beispiel: int score_array [80] = {1,1,1,1, ...};
Mit dem folgenden Code erhalten Sie das Level für jedes Ergebnis:
level2 = score_array [score2];
Dies wird bis zu einer Maschinenanweisung kompiliert. Geht nicht viel schneller.
Wenn der score
einen "handhabbaren" Bereich hat, wie wäre es mit dem folgenden?
Die Motivation besteht darin, bedingten Code ( if
, else
s) auf Kosten einer vorbelegten Tabelle zu vermeiden. Vielleicht ist es zu viel für 3 Level, aber kann helfen, wenn die Anzahl der Level steigt.
Wenn Sie weniger Ebenen als Finger an Ihren Händen haben, sollten Sie Pauls Vorschlag. Wenn die Anzahl der Ebenen jedoch größer ist, können Sie die binäre Suche verwenden, wenn Ihre Schwellenwerte ziemlich gleichmäßig sind (und streng zunehmen). Dann können Sie der logarithmischen Laufzeit nahe kommen (ich meine, Sie waren , die nach Effizienz fragen).
Dies ist ein guter Kompromiss zwischen dem lupenreinen Vorschlag und der linearen Suche, aber es zahlt sich nur aus, wenn Sie viele Ebenen haben.
Oh, übrigens, wenn es ein Muster gibt, wie die Schwellenwerte gewählt werden, sollten Sie das verwenden, anstatt nach der richtigen Ebene zu suchen.
Tags und Links c++