Median / Boxplots mit java

Status
Nicht offen für weitere Antworten.
D

Deejay

Gast
hallo liebe community ;D ich hab heute morgen eine hausaufgabe aufbekommen und mich sofort dran gesetzt, die aufgabe scheint auf den ersten blick etwas komplex zu sein, ich brauch jediglich nur einen der meine algorithmen überprüft ;) das wäre nämlich total nett^^
aufjedenfall müssen wir ein boxplot zeichnen, bzw. erstmal die rechnungen hinter der grafik ausführen - das grafische hab ich allerdings schon fertig, es hapert nur noch am rechnen :oops:

ich lass mal etwas quellcode sprechen ;) (die GUI hab ich teilweise rausgeschnipselt da es eher unwichtig ist, jedenfalls für die algorithmen

Code:
    public double median(double[] pFolge, int von, double bis)
    {
       //erst die range bestimmen
       int i = 0;
       while(bis > pFolge[i])
       {
            i++; 
       }
        //i ist nach dem schleifendurchlauf der MAX index von der range her
      int maxindex = i; 
      if (pFolge.length%2 == 0) 
      {
          return pFolge[maxindex/2]; 
      } 
      else
      {
        return (pFolge[maxindex/2+1] + pFolge[maxindex/2]) / 2;
      }
        
    } //rdy
Code:
    public double unteresQuartil(double[] pFolge, int pAnzahl)
    { //quartil ist der median vom median^^
        int oben = (pAnzahl-1)/2;
        if (pAnzahl%2 == 0){
            return median(pFolge,0,oben-1);
        }
        else return median(pFolge,0,oben);
    } //rdy vom lehrer her

das sind die beiden algorithmen, durch bisschen probieren glaub ich das der fehler im else vom Median steckt, da er bei einer geraden anzahl von werten im array (also die anzahl, nicht der index!) die beiden zahlen nicht miteinander summiert, sondern nur die eine zahl darunter ausgibt^^
ich sitz da schon paar stunden dran, und durch googlen hab ich auch keinen wirklich brauchbaren algo gefunden, leider =( ich hoffe dass es einfach nur ein flüchtigskeitsfehler ist und dass ihr mir helfen könnt ;)

mathematisch gesehn weis ich wie man es berechnet, nur ich bin zu plöd um es in code zu verfassen :bloed:

falls ihr mehr code braucht, sagt einfach bescheid ^^
schonmal vielen dank für die hilfe [/code]
 

Marco13

Top Contributor
Wenn du einen Array mit 1000 Einträgen zwischen 0.0 und 1.0 hast, und an die Quartilsdingensmethode übergibst, wie weit läuft dann diese ominöse while-Schleife am Anfang der median-Methode?
 
D

deejay

Gast
einmal ;) aber! es ist dafür ausgelegt dass du es mit dezimalen zahlen füllst, allerdings war double im rest vom GUI gerüst schon drindeswegen hab ichs halt so durchlaufen lassen bis er die letze zahl in diesem array bereich gefunden hat^^
 

Marco13

Top Contributor
Code:
class MedianTest
{
    public static void main(String args[])
    {
        double a[] = new double[1000];
        for (int i=0; i<a.length; i++)
        {
            a[i] = Math.random();
        }
        unteresQuartil(a, a.length);
    }
    
    public static double median(double[] pFolge, int von, double bis)
    {
       //erst die range bestimmen
       int i = 0;
       while(bis > pFolge[i])
       {
            i++;
       }
        //i ist nach dem schleifendurchlauf der MAX index von der range her
      int maxindex = i;
      if (pFolge.length%2 == 0)
      {
          return pFolge[maxindex/2];
      }
      else
      {
        return (pFolge[maxindex/2+1] + pFolge[maxindex/2]) / 2;
      }
       
    } //rdy
    
    public static double unteresQuartil(double[] pFolge, int pAnzahl)
    { //quartil ist der median vom median^^
        int oben = (pAnzahl-1)/2;
        if (pAnzahl%2 == 0){
            return median(pFolge,0,oben-1);
        }
        else return median(pFolge,0,oben);
    } //rdy vom lehrer her    
}

In deinem Problemlösungsalgorithmus ist auch noch ein kleiner Fehler:
Code:
while (!codeWorx())
{
    // think(); // <- Die Zeile solltest du unbedingt einkommentieren!
    typeSomething();
    compileAndStart();
}
 
D

deejay

Gast
^^ ja ich weis ;) ich habs mir doch schon überlegt mensch^^
bevor wir hier in das phasenmuster reinkommen

also der algorithmus von meiner seite aus..
also man hat als parameter das array, den werte bereich von -> bis
so... also läuft eine schleife mit einer fiktiven zahl i die schleife solange durch bis er den "bis-wert" erreicht hat. dies ist dann logischerweise das neue maximum der werte^^
also muss man daraus nur noch die mitte bestimmen, und schon ist man fertig

allerdings ist da irgendwo der wurm bei einer geraden anzahl von werten aus der urliste
der knackpunkt mit dem double ist mir aufgefallen, ich gebe aber nur ganze zahlen ein... ob da jetzt 5.0 steht oder 5 ist wayne


so hab mir schon genug dabei gedacht, jetzt seid ihr dran :p
sorry das ich keine mainschleife gemacht hab, da ich mit blueJ arbeite und das ding in einem applet stehen sollte


allerdings danke zu deiner methodik hätte nie im leben gedacht das man sich erst was denk, es dann aufschreibt und es dann startet!
 

Marco13

Top Contributor
also man hat als parameter das array, den werte bereich von -> bis
so... also läuft eine schleife mit einer fiktiven zahl i die schleife solange durch bis er den "bis-wert" erreicht hat. dies ist dann logischerweise das neue maximum der werte^^
also muss man daraus nur noch die mitte bestimmen, und schon ist man fertig

also wenn man den median bestimmen will dann hat man so einen array und so mit dem array macht man dann also das mit dem gerade und ungerade und wenn man das hat nimmt man also den wert der bei dem algorythmus rausgekommen ist und dann tut man fertig sein getan ^^

Aber mal im Ernst: Man braucht für die Berechnung des Medians wohl keine Schleife. Wenn man davon ausgehen kann, dass der Eingabe-Array sortiert ist, ist die Bestimmung des Medians etwa ein Zweizeiler. Wenn man den Array noch sortieren muss, sind's höchstens 4 Zeilen. Schau' dir nochmal die Definition an.
Wenn man eine gerade Anzahl Elemente hat, dann ist der Median .... ?
Wenn man eine ungerade Anzahl Elemente hat, dann ist der Median .... ?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben