Ich habe ein Array von Float-Werten und möchte den Wert und vor allem die Position der maximal vier Werte.Wie finden Sie die oberen verschiedenen Werte von einem Array?
Ich baute das System ursprünglich, um durch das Array zu gehen und das Maximum auf die übliche Weise zu finden, indem es den Wert an der aktuellen Position mit einer aufgezeichneten Max-so-weit vergleicht und eine Positionsvariable aktualisiert, wenn die max-so- weit Änderungen. Das funktionierte gut, ein O (n) Algo, der sehr einfach war. Ich habe später gelernt, dass ich nicht nur den oberen Wert, sondern die oberen drei oder vier behalten muss. Ich erweiterte das gleiche Verfahren und komplizierte die Max-So-Fern in eine Anordnung von vier Max-So-Fars und jetzt ist der Code hässlich.
Es funktioniert immer noch und ist immer noch ausreichend schnell, da nur eine triviale Menge an Berechnungen zum Verfahren hinzugefügt wurde. Es geht immer noch effektiv über das Array und überprüft jeden Wert einmal.
Ich mache dies in MATLAB mit einer Sortierfunktion, die zwei Arrays zurückgibt, die sortierte Liste und die zugehörige ursprüngliche Positionsliste. Mit Blick auf die ersten paar Werte habe ich genau das, was ich brauche. Ich repliziere diese Funktionalität in einem C# .NET 2.0-Programm.
Ich weiß, dass ich etwas ähnliches mit einem List-Objekt tun könnte, und dass das List-Objekt eine eingebaute Sortierroutine hat, aber ich glaube nicht, dass es mir die ursprünglichen Positionen sagen kann, und das sind wirklich was ich bin nach.
Es hat gut funktioniert, aber jetzt finde ich mich will den fünften Max-Wert und sehe, dass die Max-so-weit-Checker, die derzeit eine hässliche Unordnung ist, wenn Aussagen würden nur die Hässlichkeit zusammen. Es würde gut funktionieren und nicht langsamer sein, ein fünftes Level hinzuzufügen, aber ich möchte die SO-Community fragen, ob es einen besseren Weg gibt.
Das Sortieren der gesamten Liste erfordert viel mehr Berechnungen als meine aktuelle Methode, aber ich denke nicht, dass es ein Problem wäre, da die Liste "nur" ein oder zweitausend Fließkommazahlen enthält; Wenn es also eine Sortierroutine gibt, die die ursprünglichen Positionen zurückgeben kann, wäre das ideal.
Als Hintergrund ist dieses Array das Ergebnis einer Fourier-Transformation auf einer Kilobyte der Wave-Datei, so dass die Positionen der Max-Werte den Spitzenfrequenzen der Sample-Daten entsprechen. Ich war mit den ersten vier zufrieden, sah aber die Notwendigkeit, die Top 5 oder 6 für eine genauere Probenklassifizierung zu sammeln.
Duplizieren von: http://stackoverflow.com/questions/398945/collect-lowest-numbers-algorithm – FryGuy
Oi, shouldve ich für das Gegenteil meiner Frage gesucht, bevor :) – Karl