Ich versuche, die oberste sagen, 100 Punkte aus einer Liste von Punkten, die von meinem Programm generiert werden. Leider ist die Liste riesig (in der Größenordnung von Millionen bis Milliarden), so dass das Sortieren ein zeitintensiver Teil des Programms ist.Schnellster Weg, um die größten X-Nummern aus einer sehr großen unsortierten Liste zu erhalten?
Was ist der beste Weg, um die Top 100 Punkte zu sortieren? Die einzigen beiden Methoden, die ich mir vorstellen kann, sind entweder zuerst alle Partituren zu einem riesigen Array zu generieren und dann zu sortieren und die Top 100 zu nehmen. Oder zweitens X Nummer der Partitur zu generieren, sie zu sortieren und die Spitze abzuschneiden 100 Punkte setzen dann fort, mehr Punkte zu erzeugen, sie der gekürzten Liste hinzuzufügen und sie dann wieder zu sortieren.
Wie auch immer ich es tue, es dauert noch mehr Zeit, als ich möchte, irgendwelche Ideen, wie es auf eine noch effizientere Art und Weise zu tun? (Ich habe noch nie zuvor Programmierkurse belegt, vielleicht wissen diejenigen von Ihnen, die einen Doktortitel haben, über effiziente Algorithmen, um das zu tun, zumindest hoffe ich darauf).
Schließlich, was ist der Sortieralgorithmus von der Standardfunktion sort() in C++?
Danke,
-Faken
Edit: Nur für jeden, der neugierig ist ...
ich einige Zeit Studien über die zuvor und nach und hier sind die Ergebnisse:
altes Programm (Preforms nach jeder Außenschleifeniteration Sortieren):
top 100 scores: 147 seconds
top 10 scores: 147 seconds
top 1 scores: 146 seconds
Sorting disabled: 55 seconds
neues Programm (Tracking von nur Spitzenwert der Implementierung und Verwendung der Standardsortierfunktion):
top 100 scores: 350 seconds <-- hmm...worse than before
top 10 scores: 103 seconds
top 1 scores: 69 seconds
Sorting disabled: 51 seconds
neue Rewrite (Optimierungen in Daten gespeichert, handgeschriebener Sortier-Algorithmus):
top 100 scores: 71 seconds <-- Very nice!
top 10 scores: 52 seconds
top 1 scores: 51 seconds
Sorting disabled: 50 seconds
auf einem Kern Fertig 2 , 1,6 GHz ... Ich kann nicht warten, bis mein Kern i7 860 ankommt ...
Es gibt eine Menge anderer, noch aggressiverer Optimierungen für mich (hauptsächlich im Bereich der Reduzierung der Iterationen) run), aber wie es jetzt steht, ist die Geschwindigkeit mehr als g Oh genug, ich könnte mich nicht einmal darum kümmern, diese Algorithmus-Optimierungen zu erarbeiten.
Danke an eveyrone für ihre Eingabe!
Nur neugierig, was ist der Bereich der Zahlen, die Sie produzieren? Scheint, dass die Top 100 aus einer Liste von einer Milliarde Zahlen an der Spitze viele wiederholte Werte haben würde, es sei denn, Ihre Werte sind an sich sehr große Zahlen. –
Mir war nicht bewusst, dass es eine Standardsortierung() gibt. Welche Bibliothek benutzt du? Es ist wahrscheinlich eine schnelle Art. –
Mein Zahlenbereich ist variabel, ich habe einige Gewichtungswerte, die ich anpassen kann, um die Bereiche zu ändern. Für jetzt ist es zwischen 3000 bis etwa 40000. Der Nummerntyp ist Int, so dass ich den vollen Bereich verwenden kann. Die Standardbibliothek, die verwendet wird, ist die. –
Faken