Wirtschaftsinformatik I - Tutorium 6/ 7 (April 2010) Zusatzinformationen - Lösungsvorschläge Wirtschaftsinformatik I Tutorium Jochen Daum (4.Semester BWL) Universität Mannheim Rechtshinweis: Diese Präsentation wurde von keiner wissenschaftlich geprüften akademischen Hilfkraft erstellt und sämtliche Informationen dienen ausschließlich zu Informationszwecken und erheben keinen Anspruch auf Richtigkeit
Nachtrag zum 6.Tutorium Info zur Aufgabe 2) Auf der Spielwiese gibt es unter Freigabe Aufgaben Blatt6_Aufgabe2.cs ein Gerüst, dieses gibt aktuell nur -1 aus, aber hier könnt ihr das Wissen des Algorithmenschreibens gerne testen 2
Nachtrag zum 6.Tutorium Lösung der Aufgabe Wie aber schon im Tutorium besprochen wenden wir uns einer ganz bestimmten Struktur zu. 1) Prüfen der Mitte des Arrays 2) Auswahl der richtigen Hälfte des Arrays 3) und wie besprochen weiter verfahren => eine super Lösung hierzu wird euch auf dem nächsten Slide präsentiert Das letzte -1 des Algrithmus return -1; //dieses Return wird nur erreicht, wenn eine Zahl kleiner dem größten Array Wert (10) gesucht wird, die aber NICHT im Array enthalten ist Bsp. wenn man aus der 10 eine 11 macht und nach der 10 suchen lässt => Im Tutorium war dieser letzte Befehl jedoch auch sehr wichtig, weil wir mit if else if else if... gearbeitet hatten, wenn man sich hier jedoch vorstellt, dass der Compiler den Algorithmus testet, dann braucht man zur Sicherheit eine Bedingung die immer passt, das war unser -1, da theoretisch alle if, else if, usw. Abschnitte die Prüfung nicht bestehen könnten. 3
Nachtrag zum 6.Tutorium Lösung eines Studenten (inklusive der Auskommentierung ) herzlichen Dank hierfür Bitte kopiert den unten stehenden Text in die Spiewiese und analysiert anschließend die einzelnen Prozessschritte, bei Problemen können wir den Algorithmenablauf gerne nochmal kurz besprechen. Solche Fragen und weitere Fragen zu Algorithmen auch zur Rekursion gerne auch in den Ausweichtutorien dienstags Abends public int binarysearchrec(int[] listnum, int numtofind, int low, int high) { int mid = (low + high) / 2; if(listnum[high] < numtofind) { return -1; //Abfrage muss enthalten sein, um eine Endlosschleife zu umgehen (wäre diese Abfrage nicht enthalten würde es bei einer Zahl, die NICHT im Array steht wie z.b. 11 ab dem vierten Schleifendurchlauf immer wieder die 9 als mid ausgeben und sich somit immer wieder auf den Wert 10 beziehen) --> es wird mit dieser Abfrage bezweckt zu schauen, ob ein Wert gesucht wird, der GRÖßER als der größte im Array befindliche Wert ist; falls ja gibt es -1 zurück if(listnum[mid] == numtofind) { return mid; if(listnum[mid] > numtofind) { high = mid - 1; //die Zahl ist kleiner als die mid des listnum Arrays, deshalb verschieben wir die End-Adresse des Arrays (eigentlich 9) auf die mid - 1 return binarysearchrec(listnum, numtofind, low, high); //Rekursionsaufruf der Funktion (ACHTUNG: Alle Variablen werden durch den Rekursionsaufruf überschrieben; man könnte also auch direkt im Rekursionsaufruf binarysearchrec(listnum, numtofind, low, mid - 1); schreiben if(listnum[mid] < numtofind) { low = mid + 1; //die Zahl ist größer als die mid des listnum Arrays, deshalb verschieben wir die Anfangs-Adresse des Arrays (eigentlich 0) auf die mid + 1 return binarysearchrec(listnum, numtofind, low, high); return -1; //dieses Return wird nur erreicht, wenn eine Zahl kleiner dem größten Array Wert (10) gesucht wird, die aber NICHT im Arrayenthalten ist Bsp. wenn man aus der 10 eine 11 macht und nach der 10 suchen lässt public void resultingmethod() { int[] entrylist = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10; //Deklaration und Initialisierung des Arrays Array.Sort(entryList); //Array sortieren, falls doch eine Zahl unsortiert wäre int find = 10; //Zahl die im Array gesucht werden soll int lowest = 0; //Startwert des Arrays (ist immer 0, da die Adresse eines Arrays von 0 hochgezählt wird; für entrylist wäre das 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 int highest = entrylist.length - 1; //muss bei Länge - 1 bleiben, da es sonst die Adresse (Position im Array) nicht richtig interpretieren kann int resulting = binarysearchrec(entrylist, find, lowest, highest); if(resulting == -1) { //durch diese Abfrage erzeugen wir eine separate Ausgabe, falls die gesuchte Zahl nicht gefunden wurde Console.WriteLine ("Der Wert " + find + " wurde nicht gefunden!"); //Ausgabe, wenn Wert im Array nicht gefunden wurde else { Console.WriteLine ("Der Wert " + find + " steht im Array entrylist an der Stelle " + resulting); //Ausgabe des Wertes mit Position im Array (falls er gefunden wurde) 4
Nachtrag zum 6.Tutorium Aufgabe 3 Terminierung: Die Lösungen der Algorithmen mit den Rekursionen Wenn wir speziell das Schreiben von Algorithmen mit Rekursionen, bzw. die Analyse wie sich Rekursionen auf die Laufzeit verhalten nochmal analysieren sollten, dann bitte ich um Rückmeldung. Es wird von jedem Student, der das Modul Wifo I besucht erwartet, dass er solche Algorithmen versteht und ggf. Algorithmen mit Rekursionen schreiben kann. 5
Nachtrag zum 7.Tutorium Aufgabe 2a: Der Algorithmus vergleicht paarweise alle Elemente des als Parameter übergebenen Arrays ar. Dabei wird zuerst das letzte Element mit allen anderen Elementen verglichen (von hinten nach vorne). Wann immer ein Element kleiner ist als das aktuell letzte Element, werden die beiden Elemente getauscht. Als nächstes wird das vorletzte Element mit allen voranliegenden Elementen verglichen. Dabei wird auf die gleiche Weise wie zuvor vorgegangen. Am Ende sind die Werte im Array der Größe nach sortiert. Wobei der größte Wert vorne und der kleinste Wert hinten steht. 6
Nachtrag zum 7.Tutorium Aufgabe 3: Warum liegt die Laufzeit in O(n²)? Zu dieser Lösung nur ein paar Hinweise, wir haben es ja ausführlich besprochen Wir denken an ein worst-case-scenario (komplett unsortiert - kleinstes Element an letzter Position) Wir finden zwei Schleifen while & for Schleife Jede Schleife kann n mal laufen. Durch die Verschachtelung Schleifen liegen ineinander kommt es zu einer Multiplikation der Laufzeiten n -Tauschvorgänge innerhalb der while - Schleife, die selbst n mal laufen kann. (Konstanten +1 / -1 unberücksichtigt) Wir analysieren den Unterschied zu Aufgabe 2 dieses Tutoriums Bei Bubble Sort werden nicht einzelne Elemente mit den gesamten Array- Elementen vergleichen, vielmehr werden jeweils Paare vergleichen, d.h. benachbarte Elemente werden ggf. getauscht. - Bis das kleinste Element, das durch Zufall zu Beginn am Array-Ende stand, an den Array- Anfang gewandert ist sind n(=anzahl der Array-Elemente) Schleifendurchläufe der while - Schleife notwendig. In jeder dieser Schleife werden alle benachbarten Zahlenpaare vergleichen, was erneut bis zu n-vorgänge bedeuten kann. Durch diesen Vorgang kommt die Laufzeit n² zustande 7
Nachtrag zum 7.Tutorium => Terminierung, wenn for-schleifendurchlauf ohne Tauschvorgang, dann wird numberofswaps in keinem Durchlauf der for-schleife erhöht und somit gleich 0. Die if-bedingung setzt issortet auf true und die while-schleife terminiert. Wir kommen zu return und der sortierte Array wird ausgegeben 8
Wochen mit Feiertagen (donnerstags) Ausweichtermine: dienstags B7 (19:00 20:30 Uhr) im Schloß, Raum O129 Wir treffen uns in den Wochen, die am Donnerstag einen Feiertag besitzen jeweils dienstags in unserem regulären Tutoriums-Raum. Ich bitte alle Studenten zu Beginn des Blocks (um 19:00 Uhr) anwesend zu sein. Wir werden in 45 Minuten wie gewohnt das Tutorium durchsprechen. Anschließend können wir uns Fragen von Studenten zuwenden oder ggf. noch weiter zusätzliche Übungsaufgaben ansprechen, wenn Bedarf besteht (bitte meldet diesen Bedarf per Email an mich an: jdaum@mai.uni-mannheim.de). INFO: Wer an diesem Termin nicht teilnehmen kann, der suche sich ein anderes Tutorium in diesen zwei Wochen (mit Feiertag am Donnerstag) und schicke mir eine Email mit der Info, dass er dienstags nicht anwesend sein kann. 9
Informationsbeschaffung Danke für eure Aufmerksamkeit nächstes Tutorium: diese Woche, Donnerstag 06.05.2010 10