Menge von Zahlen prozentual eingrenzen



  • Hallo Leute

    der Titel des Threads ist etwas doof, denn ich kann das Problem schlecht in wenige Worte fassen.

    Ich habe eine Reihe von N Zahlen ( >= 0 ), die begrenzt werden durch das Minimum und das Maximum. Jetzt möchte ich einen bestimmten Wert ermitteln, für den gilt, dass z.B. 90% der Zahlen kleiner sind als dieser Wert.

    Natürlich kann man das Problem einfach aber unperformant lösen. Man legt einen fiktiven Wert fest, zählt, wieviele Zahlen darunter liegen und erhöht den Wert dann sukzessive, bis es passt. Aber das scheint mir eine recht unperformante Lösung zu sein.

    Hat jemand sich diesem Problem schonmal gewidmet und hat vielleicht eine bessere Lösung?

    ( ich brauch keinen Code, nur ne Idee 😉 )

    gruß

    Tobi



  • Anmerkung:

    es handelt sich dabei um aktuell 1000 * 20 = 20000 Werte des Typs double...
    Aber die Menge ist durchaus flexibel durch den Benutzer der Klasse zu gestalten und daher kann es auch deutlich mehr werden, so dass eine performante Lösung her muss 🕶

    PS: ich programmiere in C++


  • Mod

    Wie wäre es mit Sortieren und dann den Wert an der passenden Position rauspicken?



  • Hmm das is ja schonmal ein Anfang 😉

    Leider liegen die Zahlen in strukturen, die von verschiedenen Containern verwaltet werden ( nicht nur von einem ).

    Ich müsste die doubles dann in einen gemeinsamen vector performant schreiben und dann mit std::sort sortieren...

    Gut, die Länge ist mir bekannt, und ich kann mit reserve den Vector schonmal auf die Menge vorbereiten, daher könnte die Lösung sogar recht gut sein.
    Ich probiers mal. Danke erstmal 🙂



  • Mal eine blöde Frage: Wie genau muss der Wert sein? Also müssen es genau 90% sein oder auch mal ein paar Elemente zu groß sein. Sind die Zahlen gleichverteilt, oder sind diese schon vorsortiert, ...
    +++ Reicht es aus mit einer gewissen statischen Wahrscheinlichkeit einen reichtigen Wert zu erhalten?



  • Die Zahlen sind nicht gleichverteilt. Ich würde sogar fast sagen, die wären normalverteilt. Kann das aber nicht genau sagen, weil ich ja gerade erst dabei bin, die Datenreihen auszuwerten 😉

    Hab die auch nicht in einer Datei liegen, denn sonst könnte ich Excel mal ne Verteilung basteln lassen.

    Der Wert muss nicht exakt sein. Wenn ich 90% angebe, würde ich auch mit 85 - 95% gut leben können. Es gibt nur einige wenige starke Ausreißer nach oben und die Würde ich gern ausgrenzen.



  • Ich denke mal, die Lösung von Sepp passt ganz gut 🙂 Danke euch allen für euer Engagement 🙂



  • Noch eine Idee: Wenn sie normalverteilt sind, kannst du doch einfach Mittelwert und Varianz ausrechnen. Für 90% wäre die Grenze dann 1.2 Standardabweichungen über dem Mittelwert (siehe Fehlerfunktion).



  • Ich hab die Daten jetzt mal in eine Datei geschrieben, weil mich selber interessiert hat, wie die nun verteilt sind.
    Die sind exponentialverteilt.

    Im Bereich 0-1 sind es sehr viele, und dann fällt die Häufigkeit exponentiell.


Anmelden zum Antworten