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

Informatiker Board » Themengebiete » Praktische Informatik » Medoidtest » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Medoidtest
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
neuling96
unregistriert
Medoidtest Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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ächsten
     * liegt.
     *
     * @param numbers Die Menge von Zahlen, deren Medoid berechnet werden soll.
     * @return Gibt den Medoid der Eingabemenge von Zahlen zurü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
16.12.2014 05:40
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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];
}


__________________
Syntax Highlighting fürs Board (Link)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von eulerscheZahl: 16.12.2014 16:52.

16.12.2014 08:07 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
neuling96
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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]);
16.12.2014 16:47
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;.

__________________
Syntax Highlighting fürs Board (Link)
16.12.2014 16:52 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Medoidtest