Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Medoidtest » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 4 Beiträge
eulerscheZahl

Mit i statt 0 hast du Recht. Habe ich ausgebessert.

Wenn du keinen Betrag verwenden willst, gibt es auch andere Wege. Du kannst die Zahl quadrieren, dann wird sie auch positiv. Oder du baust dir selbst einen Betrag mit if (zahl < 0) zahl *= -1;.
neuling96

Zitat:
Original von eulerscheZahl


Jetzt findet das Programm auch den richtigen Wert.

ein paar Verbesserungsvorschläge:
Den Mittelwert würde ich nicht als Ganzzahl berechnen. Sonst kann es sein, dass bei einem Mittelwert von 5.9 trotzdem die 5 statt der 6 ausgegeben wird.
Die Variable test ist nicht unbedingt nötig -> nicht so viel Speicher verschwenden
In der while-Schleife am Ende (bei der for die bessere Wahl wäre), hast du in if und in else y++, das könnte man also auch rausziehen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public static int medoid(int[] numbers) {
	int sum = 0;
	for (int i = 0; i < numbers.length; i++) {
		sum += numbers[i];
	}
	float mittel = (float)sum / numbers.length;
	int index = 0;
	float minDiff = Math.abs(mittel - numbers[0]);
	for (int i = 1; i < numbers.length; i++) {
		if (Math.abs(mittel - numbers[i]) < minDiff) {
			minDiff = Math.abs(mittel - numbers[0]);
			index = i;
		}
	}
	return numbers[index];
}


Wir hatten noch nicht math.abs()
gehts auch anders?


müsste statt der null nicht i stehen?

if (Math.abs(mittel - numbers[i]) < minDiff) {
minDiff = Math.abs(mittel - numbers[i]);
eulerscheZahl

erst mal in eine leserliche Form bringen und die Variable sum initialisieren:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
public static int medoid(int[] numbers) {
	int sum = 0;
	int mittel;
	for (int i = 0; i < numbers.length; i++) {
		sum += numbers[i];
	}
	int [] test = new int[numbers.length];
	mittel = sum / numbers.length;
	for (int i = 0; i < numbers.length; i++) {
		test[i] = mittel - numbers[i];
	}
	int y = 1;
	int i = 0;
	while (y < numbers.length) {
		if ( test[i] < test[y]) {
			y++;
		} else {
			i = y;
			y++;
		}
	}
	return numbers[i];
}

Das Problem:
wenn du eine Zahl hast, die größer als der Mittelwert ist, steht in test an dieser Stelle etwas negatives.
Für dein Beispiel konkret: [7, 10, 6, -28, 1]
Bei dem Vergleich test[i] < test[y] wird also die -28 gefunden, weil das die kleinste Zahl ist.
Du musst also irgendwo den Betrag einbauen, z.B. so: test[i] = Math.abs(mittel - numbers[i]);

Jetzt findet das Programm auch den richtigen Wert.

ein paar Verbesserungsvorschläge:
Den Mittelwert würde ich nicht als Ganzzahl berechnen. Sonst kann es sein, dass bei einem Mittelwert von 5.9 trotzdem die 5 statt der 6 ausgegeben wird.
Die Variable test ist nicht unbedingt nötig -> nicht so viel Speicher verschwenden
In der while-Schleife am Ende (bei der for die bessere Wahl wäre), hast du in if und in else y++, das könnte man also auch rausziehen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public static int medoid(int[] numbers) {
	int sum = 0;
	for (int i = 0; i < numbers.length; i++) {
		sum += numbers[i];
	}
	float mittel = (float)sum / numbers.length;
	int index = 0;
	float minDiff = Math.abs(mittel - numbers[0]);
	for (int i = 1; i < numbers.length; i++) {
		if (Math.abs(mittel - numbers[i]) < minDiff) {
			minDiff = Math.abs(mittel - numbers[i]);
			index = i;
		}
	}
	return numbers[index];
}
neuling96 Medoidtest

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
/**
 * Medoid Klasse. Diese Klasse dient zur Berechnung des Medoids einer Menge von
 * Zahlen.
 */
public class Medoid {

    /**
     * Die Methode medoid berechnet den Medoid eines Arrays vom Typ double. Der
     * Medoid ist die Zahl, die dem Mittelwert aller Zahlen am n&auml;chsten
     * liegt.
     *
     * @param numbers Die Menge von Zahlen, deren Medoid berechnet werden soll.
     * @return Gibt den Medoid der Eingabemenge von Zahlen zur&uuml;ck
     */
    public static int medoid(int[] numbers) {
		int sum;
    int mittel;
for (int i =0; i<numbers.length; i++){
sum+=numbers [i];
	}
 int [] test= new int [numbers.length];
mittel =sum/numbers.length;
for (int i =0; i<numbers.length; i++){
 test[i]= mittel-numbers [i];
 	}
       int y=1;
       int i=0;
while (y<numbers.length){
if ( test [i] < test [y]){
  y=y+1;
	} else {
               i=y;
                   y=y+1;
      }
     }
    return numbers [i];
}
}


1) macht das sinn?

2) wie füht man bsp ein um zuprüfen ob es stimmt?

code:
1:
2:
public static void main(String[] args)
 {System.out.println("medoid(7,4,8,42,13)=" + medoid(new int[]{7, 4, 8, 42, 13})); 
<- funktioniert nicht