Werte nach Abweichung (aus-)sortieren

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VBWorld.

    Werte nach Abweichung (aus-)sortieren

    Hallo,

    ich muss aus bestimmten Zahlen Werten, Zahlen aussortieren, die eine hohe Abweichung von den anderen haben.
    Beispiel:

    Werte:

    125,13,21,15,17,120, 117, 73,19,20,23,28,121

    Aufgabe:

    Die Werte sollen der Größe nach sortiert werden, 3er Schritte liegen noch im toleranz Bereich aber 20er oder gar 100er Schritte sollten aussortiert werden, dass heißt das Ergebnis würde lauten:

    13,15,17,19,20,23

    Jetzt könnte man denken, dass

    117,120,121

    auch ein Ergebnis ist. Aber es soll immer nur das Ergebnis richtig sein, welches an meisten Werte beinhaltet.
    Mir fällt leider kein gescheiter Lösungsweg ein. Hat jemmand eine Idee?

    MFG

    VBWorld
    MFG VBWorld
    Mathe ist für alle die, die nicht mit dem Taschenrechner umgehen können :D

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Infer Off
    3. Module Module1
    4. Sub Main()
    5. Sortierenn({125, 13, 21, 15, 17, 120, 117, 73, 19, 20, 23, 28, 121})
    6. Console.ReadKey()
    7. End Sub
    8. Private Sub Sortierenn(inp As Double())
    9. Dim min As Double = inp.Min
    10. Dim b As Double() = inp.OrderBy(Function(e) e).TakeWhile(Function(d) (d - min) <= 20).ToArray
    11. b.ToList.ForEach(Sub(w) Console.WriteLine(w))
    12. End Sub
    13. End Module


    Die Wertebereich "Ausreißergröße" kann man dann da festlegen , wo jetzt die 20 steht.
    Evtl. so?
    @Daniel Baumert Das würde ich nicht über LINQ machen, denn da siehst Du nicht, was passiert.
    @VBWorld Bilde den Mittelwert dieser Zahlen (Double) und sortiere die Differenzen von Wert und Mittelwert nach Größe (da gibt es positive und negative Werte).
    Jetzt hast Du am einen Ende dieser Liste die eine Klasse (13,15,17,19,20,23), am anderen Ende die andere (117,120,121). Die Gruppe mit der größeren Anzahl ist dann die richtige.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hätte folgendes:

    C#-Quellcode

    1. static void Main(string[] args)
    2. {
    3. List<int> l = new List<int>() {125, 13, 21, 15, 17, 120, 117, 73, 19, 20, 23, 28, 121 };
    4. var r = Blub(l);
    5. Console.WriteLine(string.Join(", ", r));
    6. Console.ReadLine();
    7. }
    8. static List<int> Blub(List<int> l)
    9. {
    10. l.Sort();
    11. List<List<int>> clusters = new List<List<int>>();
    12. List<int> tmp = new List<int>();
    13. foreach (int i in l)
    14. {
    15. if (tmp.Count == 0 || i - 3 < tmp.Last())
    16. {
    17. tmp.Add(i);
    18. }
    19. else
    20. {
    21. clusters.Add(tmp);
    22. tmp = new List<int>();
    23. }
    24. }
    25. return clusters.OrderBy(c => c.Count).Last();
    26. }
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    C#-Quellcode

    1. if (tmp.Count == 0 || i - 3 < tmp.Last())
    Aufgrund welcher göttlichen Eingebung kommt da der Wert 3 her? ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany :

    VBWorld schrieb:

    3er Schritte liegen noch im toleranz Bereich aber 20er oder gar 100er Schritte sollten aussortiert werden

    Ich habe es so aufgenommen, dass die 3 konstant sei, ich dachte nicht dass die dynamisch ermittelt werden soll ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    dass die 3 konstant sei
    Solche Annahmen sind die Ursache für Flugzeugabstürze und so zeugs.
    Du musst das Problem zunächst allgemein lösen und dannsehen, was passiert. Interessant wird es, wenn beide "Randgruppen" gleich groß sind oder wenn es mehrere Gruppen gleicher Mächtigkeit gibt, da muss dann der Algorithmus erweitert werden.
    In jedem Falle muss das Programm so etwas zumindest merken und mit einer Exception reagieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany :
    a) ich bin kein Flaugzeugingeneur, somit bin ich auch für keine ABstürze verantwortlich ^^
    b) Aber wie soll diese Zahl denn ermittelt werden ? Denn so wie ich das momentan verstehe, kann diese Aufgabe keine eindeutige LÖsung aben ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThePlexian“ ()

    ThePlexian schrieb:

    keine eindeutige Lösung haben
    Jou.
    Du hast es verstanden. Das Programm muss dies dann kundtun durch was auch immer und manuellen Eingriff fordern.
    Für die Auswertung von solch ist Excel prädestiniert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!