Wenn du dich kostenlosregistrierst kannst du neue Themen verfassen, an Umfragen teilnehmen und vieles mehr. Falls Du bei der Registrierung oder Anmeldung Probleme hast, dann kontaktiere uns.
Hallo zusammen, habe im Anhang eine Frage die von meiner Zulassung abhängt finde aber keinen Ansatz sie zu lösen. Vielleicht wißt ihr wie es gemacht werden soll.
Korrigiere, der erste Schritt ist bei n=1.
Du überlegst dir jetzt, wenn das angesprochene Feld genau "1" lang ist, wie oft die Funktion um ungünstigsten Fall sich selbst wieder aufrufen muss. Bei n=1 gibts da ja nicht so viele Möglichkeiten.
Darauf aufbauend kannst du dann rekursiv angeben, wie der Aufwand wächst und somit zum Schluss eine Klassifizierung in Landau-Notierung angeben.
Eh, bist du sicher, dass das dein Fach ist? *SCNR*
Am Anfang ist die linke Grenze die 0 und die rechte das Maximum a. Dann wird verglichen, ob die rechte Grenze noch größer als die linke ist und dann wird ein neues Maximum in diesem Intervall gesucht. Dazu wird wieder die Funktion "Maxsuche" aufgerufen. Also ein rekursiver Aufruf, der T(n) beeinflusst.
Bist du sicher, dass du verstanden hast, was der Algorithmus macht? Der Algorithmus teilt das zu durchsuchende Feld in der Mitte und sucht rekursiv das Maximum in den beiden Teilfeldern. Das geht so weiter, bis er das absolute Maximum gefunden hat.
Nun sollst du ermitteln, wie oft im ungünstigsten Fall die Funktion "Maxsuche" (= Anzahl der Vergleiche) aufgerufen wird.
Ob du nun die Anzahl der Aufrufe von Maxsuche() oder die Anzahl der Vergleiche bestimmst, das kommt auf das Gleiche raus. Schließlich wird der Vergleich auch bei jedem rekursiven Aufruf wieder durchgeführt.
Wieso keine Änderung ab n=3?
Wenn du aus einem Feld mit 1000 Einträgen das Maximum in nur 3 Durchläufen findest, solltest du das Verfahren zum Patent anmelden.
Jedes Mal, wenn Maxsuche aufgerufen wird und das Feld in der Mitte geteilt werden kann, wird Maxsuche noch einmal aufgerufen und so weiter und so fort. Rekursion halt. Da ist es mit 3 Durchläufen nicht getan.
Mit n=3 ist die Sache witzlos, da sie nach höchstens 2 Durchläufen beendet ist. Stell dir ein Feld a[0..9] mit den natürlichen Zahlen 0 bis 10 vor.
1. Durchlauf:
Code:
Maxsuche(a, 0, 9) {
if (0 < 9) {
ist der Fall, also m:=9/2; (=4)
max:=Maxsuche(a,0,4); } HIER IST DER
max_r:=Maxsuche(a,5,9); } KNACKPUNKT!
if (max_r > max) {
max:=max_r;
}
return (max);
else {
return (a[l]); /* Maximum am Punkt l gefunden
}
}
Da wo ich oben Knackpunkt geschrieben habe, ist dein Denkfehler. Hier springst du erneut in die Funktion Maxsuche, d.h. du fängst mit den neuen Werten ganz oben in der Funktion wieder an. Die if-Abfrage kommt erst, wenn die Rekursion ganz "nach unten" gelaufen ist und a[l] zurückgegeben hat.
Dann läuft die Rekursion wieder "nach oben" und liefert jedes Mal das Teilfeld, in dem sich das Maximum befindet, zurück. Als Ergebnis bekommst zu somit das Maximum, das "ganz unten" in der Rekursion ermittelt wird.