Föreläsningar dec 3, dec 4 v 49. GT Chapter 5 GT Chapter 6 GT Kapitel 5 analogt med boken. Om implementation av NodeList: Boken argumenterar kanske inte så mycket om varför man gör som man gör. Jag tycker nog att det blir ännu tydligare om man ritar t ex första bilden i fig 5.6 så här: Listnode mylistnode numelts header trailer På heapen prev element next.... Baltimore Providence Paris Tänk också på att objekten dessutom konceptuellt (begreppsmässigt) innehåller de publika metoderna, och att det är dem man använder. Det finns en mängd val att göra när man programmerar ListNode: - Privat / Icke-privat. Många programmerare skulle nog vara "lata" och programmera klassen DNode med tre icke-privata instansvariabler och inget annat i en icke-publik klass, men läroboken och vi är ortodoxa (grekiska för renläriga). - Rekursivt programmerade metoder (funkar ofta bra med enkla datastrukturer) / Programmerering med snurror (vårt fall, viktigat med bra datastruktur) - Låta referensvariabel direkt referera första noden (urdåligt) / En klass med innehåll för NodeList och en klass för noderna (vårt fall) - Enkel-länkning / dubbel-länkning (vårt fall)
- Ej ha vaktposter / vaktposter av enkel typ (ser missvisande ut så på bilderna i boken) / vaktposter med samma typ som vanliga noder (vårt fall) - "Linjär kedja" (vårt fall ovan) / "cirkulär kedja" (min favorit, se nedan) Det finns alltså minst 2*2*2*2*3*2 = 96 sätt att implemetera ListNode, och åtskilliga varianter föreslås i olika böcker. Om man inte gått en sådan här kurs eller läser en bok med en bra implemtation så är risken stor att man gör på ett dåligt sätt, vilket lätt leder till långa och svårprogrammerade lösningar. Mitt favoritsätt att göra NodeList är att slå ihop de två extranoderna i slutet till en, som är både slutvaktpost (trailer sentinel) och startvaktpost (header sentinel), så här: Listnode mylistnode numelts sentinel På heapen. prev element next Baltimore Providence Paris Denna lösning inehåller inga null i "ringen", och man kan följaktligen inte få NullPointerException vilket är underbart (fast istället kan man ju få oändliga snurror). Fördelen med vaktpostteknik i båda fallen är ju att man slipper specialfall för sista och/eller sista noden oc/eller tom lista osv. Avbrottsvillkoret när man skriver snurror kan också förenklas. Fördelen med dubbelänkning är ju att man enklt kan röra sig "bakåt" eller "framåt", och inga problem att man vid sökning "kommer för långt" och inte kan "backa". Ännu sämre lösningar är att t ex i figuren ovan låta mylistnode referera (peka) direkt på första elementet om detta finns och låta Listnode innehålla null för tomma listor. Sådana lösningar är svårprogrammerade och skiljer dessutom inte på skapade tomma listor och oskapade listor, vilket ger en massa trubbel i användarprogrammet vid kopiering, kloning och tilldelning.
För att det inte skall bli för mycket programmering kommer jag ända att mest utgå från bokens implemtationer. Hemligeheten med att programmera med pekare är också: Rita små bilder på papper med penna! Översikt över de i Java inbyggda typerna array, java.util.vector och String: (I pappersupplagan) GT Kapitel 6 analogt med boken
Hemuppgifter redovisning v3 (preliminärt). C = 1, 6, 7 B= 2, 4, 6, 8 A = 2, 3, 5, 6, 8 Inlämning under läsperiod 3 senast måndagar klockan 12.00. 1. C-hemuppgift : Suppose that your implementation of a particular algorithm appears in Java as: for (int pass = 1; pass <= n; ++pass) { for (int index = 0; index < n; ++index) { for (int count = 1; count < 10; ++count) {... } // end for } // end for } // end for This code shows only the repetition in the algorithm, not the computations that occur within the loops. These computations, however, are independent of n. What is the order of the algorithm? Justify your answer. 2. BA-hemuppgift : Algorithm A uses 10nlogn operations, while algorithm B uses n2 operations. Determine the value n0 such that A is better than B for n>=n0. Show formally that (n+1)5 is O(n5). Prove using the basic definition of O-notation that if d(n) is O(f(n)) and e(n) is O(g(n)), then d(n)e(n) is O(f(n)g(n)). What is the order of each of the following tasks in the worst case: Computing the sum of the first n even integers by using a for loop. Displaying all n integers in an array. Displaying one array element Displaying the last element in a singly linked list. 3. A-hemuppgift : Uppgift C3-21 GT sid 132. 4. B-hemuppgift : This problem considers several ways to compute xn for some n >= 0. (a) Write an iterative method power1 to compute xn for n >= 0. (b) Write a recursive method power2 to compute xn by using the following recursive formulation: x0 = 1 xn = x * xn-1 if n > 0
(c) Write a recursive method power3 to compute xn by using the following recursive formulation: x0 = 1 xn = (xn/2)2 xn = x * (xn/2)2 if n > 0 and n is even if n > 0 and n is odd (d) How many multiplications will each of the methods power1, power2, and power3 perform when computing 332? 319? The first thing you must do is a paper and pencil calculation of these values. Then, verify your results by instrumenting your methods so that they count up these values and output them so that you can compare with your pencil and paper calculations. (e) How many recursive calls will power2 and power3 make when computing 332? 319? Do the same pencil and paper and instrumentation exercise for this part of the problem as you did in (d). (f) (Frivilligt) What is the order of the algorithm? Justify your answer. 5. A-hemuppgift Implement the abstract data type character string by using a linked list of characters. Include typical operations such as: append one string to another extract a substring find the index of the leftmost occurrence of a character in a string (frivilligt) determine whether one string is a substring of another. Implement the string so that you can obtain its length without traversing the linked list and counting. Förslag : Jag har gjort två lösningar ( dessutom har jag en lösning från tidigare år. Implementationen går säkert också att göra som en adapter till t ex NodeList, vars lösning skall göras i sista hemuppgifte): 1. en öppen kedja med enkellänkade noder. 2. en sluten cirkulär kedja med dubbellänkade noder och en sentinel som är både header och trailer (jfr förra veckan hemuppgifter) och en metod private void insertlast(char ic). Denna lösning är mycket enklare. I både fallen Jag använde klassen Node respektive DNode från boken, (finns på /info/inda01/gtch5), men modiferade dem genom att lagra char istället för Object för att slippa göra objekt av alla tecken. Som syns i exemplet nedan har jag en konstruktor som tar ett argument som är av typen String, dvs den inbyggda strängtypen, och klassen LKString har också en metod public String tostring() för utskrifter.
Exempel på körning av min lösningar : public class TestLKString { // (finns på /info/inda01/gtch5) public static void main(string [] arg) { LKString lks1 = new LKString("hej"); LKString lks2 = new LKString("san"); LKString lks3 = new LKString("Vad tar ni för valpen" + "där i fönstret"); System.out.println(lks1); System.out.println(lks2); System.out.println(lks1.appended(lks2)); System.out.println(lks3.extracted(4,10)); System.out.println("Första f vid :" + lks3.indexof( f )); try { System.out.println("Första x vid :" + lks3.indexof( x )); } catch (Exception e) { System.out.println(e.getMessage()); } System.out.println("Första V vid :" + lks3.indexof( V )); } } /* Körreultat java TestLKString hej san hejsan tar ni Första f vid :11 Character x not in LKString object Första V vid :0 Process TestLKString finished */ 6. CBA-hemuppgift : Gör uppgift C-5.17, sidan 223 i GT, i Java med hjälp av java.util.vector (dvs lagra barnens namn i java-bibliotekns inbyggda variant av bokens ADT Vector). Diskutera körtiden. Min lösning ger detta körresultat...>java HotPotato adam bertil cesar david erik fredrik Give number of potato handovers : 4 Removing erik Removing david Removing fredrik Removing bertil Removing cesar The winner is adam
7. C-hemuppgift : Gör uppgift C-5.17, sidan 223 i GT, i Java med hjälp av bokens NodeList som implementerar bokens ADT List (dvs lagra barnens namn i ett objekt av typen NodeList). Diskutera körtiden. Du kan förstås återanvända en del kod i din lösning från hemuppgift 6. På /info/inda01/gtch5/ finns klassfiler för för NodeList, List mm. Det räcker ju att kopiera klassfiler till arbetskatalogen för att kunna använda en klass. Klassfilerna är framställda på basis av boken kod. "Code framgments" (vissa Exceptionklasser saknas dock) finns på nätet på http://loki.cs.brown.edu:8081/webdsa/source/ch05/index.html 8. BA-hemuppgift : Samma uppgift som hemuppgift 7, men man får inte använda den färdiga klassfilen för NodeList. Gör uppgift C-5.17, sidan 223 i GT, i Java med hjälp av bokens java-kod NodeList som implementerar bokens ADT List (dvs lagra barnens namn i ett objekt av typen NodeList). Diskutera körtiden. Du kan förståss återanvända en del kod i din lösning från hemuppgift 6. På /info/inda01/gtch5/ eller på nätet (vissa Exceptionklasser saknas dock) på http://loki.cs.brown.edu:8081/webdsa/source/ch05/index.html finns java-kod från boken för NodeList, List mm. Vissa metoder saknas dock, vilket märks när man försöker kompilera. Man måste alltså först komplettera med de fyra saknade metoderna.