Lösningsförslag till exempeltenta 1 1
1. Beskriv hur binärsökning fungerar. Beskriv dess pseudokod och förklara så klart som möjligt hur den fungerar. 2
Uppgift 1 - Lösning Huvudidé: - Titta på datan i den mittersta cellen. Om den är lika med den data vi letar efter returnera positionen Om den är större än den data vi letar efter leta i den vänstra halvan Om den är mindre än den data vi letar efter leta i den högra halvan Användning: Används på sorterade samlingar. Tidskomplexitet: O(log n) 3
Uppgift 1 - Lösning Pseudokod rekursiv variant: int binarysearch(array, target, low, high) //REKURSIONSSTEG IF array[mid] > target THEN binarysearch(array, target, low, mid -1) //REKURSIONSSTEG IF array[mid] <= target THEN binarysearch(array, target, mid, high) // BASFALL IF array[low] = target THEN RETURN low ELSE RETURN -1 4
Uppgift 1 - Lösning Pseudokod iterativ variant: int binarysearch(array, target) low = 0 high = array.length WHILE(high low > 0) mid = (low + high + 1) / 2 IF array[mid] > target THEN high = mid 1 ELSE low = mid IF array[low] = target THEN RETURN low ELSE RETURN -1 5
Uppgift 1 Lösning Exempel: Sök efter talet 15 1 2 15 20 50 60 70 80 90 6
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 15 == 50? 7
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 15 == 50? Nej 8
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 15 == 50? Nej 50 > 15? 9
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 15 == 50? Nej 50 > 15? Ja 10
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 (array[(0+3) / 2)] = array[1]) == 15? 11
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 (array[(0+3) / 2)] = array[1]) == 15? Nej (array[(0+3) / 2)] = array[1]) > 15? 12
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 (array[(0+3) / 2)] = array[1]) == 15? Nej (array[(0+3) / 2)] = array[1]) > 15? Nej 13
Uppgift 1 Lösning Exempel: Sök efter talet 15 15 1 2 15 20 50 60 70 80 90 (array[(2+3) / 2)] = array[2]) == 15? Ja returnera index 2 14
2. Skriv koden för en klass som implementerar följande gränssnitt(interface2) och innehåller minst två egna metoder. public interface Interface2 { public String getdescription(); 15
Uppgift 2 lösningsförslag public class Uppgift2 implements interface2 { private String name = ""; private String address = ""; // constructor public Uppgift2(String n, String a) { name = n; address = a; 16
Uppgift 2 lösningsförslag public class Uppgift2 implements interface2 { private String name = ""; private String address = ""; //setter public void setname(string n) { name = n; /setter public void setadress(string a) { address = a; 17
Uppgift 2 lösningsförslag public class Uppgift2 implements interface2 { private String name = ""; private String address = ""; //getter public String getname() { return name; /getter public void getadress() { return address; 18
Uppgift 2 lösningsförslag public class Uppgift2 implements interface2 { private String name = ""; private String address = ""; // method from the interface public String getdescription() { return "name: " + name + "address: " + address; 19
Uppgift 2 lösningsförslag public class Uppgift2 implements interface2 { private String name = ""; private String address = ""; //method public String addname(string n) { Name += " " + n; //method public String addcity(string city) { address += " " + city; 20
3. Förklara begreppet arv och ge ett kodexempel. Lösning: Arv innebär att man skapar nya klasser, subklasser, från Existerande klasser, superklasser, och utökar dem med nya metoder och instansvariabler. 21
3. Förklara begreppet arv och ge ett kodexempel. Lösning: public class MySuperClass { // instance variable int size = 1; // constructor public MySuperClass(int s) { size = s; 22
3. Förklara begreppet arv och ge ett kodexempel. Lösning: public class MySuperClass { // instance variable int size = 1; //setter public int setsize(int s) { Size = s; //getter public int getsize() { return size; 23
3. Förklara begreppet arv och ge ett kodexempel. Lösning: public class MySuperClass { // instance variable int size = 1; //method public void printsize() { System.out.println(size); 24
3. Förklara begreppet arv och ge ett kodexempel. Lösning: public class SubClass1 extends MySuperClass { // default constructor public SubClass1() { //method public int increasesize(int i) { size += i; 25
4. Vad kommer följande program att skriva ut? Förklara exempel 5 och 10 i detalj. public class TestRegularExpression { private static void tryreg(string ex, String regexp, String text) { if (text.matches(regexp)) { System.out.println(ex + " matchar."); else { System.out.println(ex + " matchar INTE."); 26
Uppgift 4 public static void main(string[] args) { tryreg("exempel 1", "a?b.*", "bb"); tryreg("exempel 2", "(ac)+", "acac"); tryreg("exempel 3", "ab*", "abbbbbbbb"); tryreg("exempel 4", "ab*", "abab"); tryreg("exempel 5", "a?b*", "abab"); tryreg("exempel 6", "a?b*", "bbbbbbb"); tryreg("exempel 7", "a+b*", "abbbbbbb"); tryreg("exempel 8", "((aa) (bb)).*c.*", "aaaacc"); tryreg("exempel 9", "((aa) (bb)).*c.*", "bbaacc"); tryreg("exempel 10", "((aa) (bb)).*c.*", "baacc"); 27
Uppgift 4 Lösning tryreg("exempel 1", "a?b.*", "bb"); Utskrift: Exempel 1 matchar. Förklaring: a? - option, a antingen finns eller inte b - b måste finnas.* - vad som helst får finnas 28
Uppgift 4 Lösning tryreg("exempel 2", "(ac)+", "acac"); Utskrift: Exempel 2 matchar. Förklaring: (ac)+ - ac måste finnas minst en gång 29
Uppgift 4 Lösning tryreg("exempel 3", "ab*", "abbbbbbbb"); Utskrift: Exempel 3 matchar. Förklaring: a - strängen måste börja på a b* - måste finnas finnas 0 eller flera b 30
Uppgift 4 Lösning tryreg("exempel 3", "ab*", "abbbbbbbb"); tryreg("exempel 4", "ab*", "abab"); Utskrift: Exempel 3 matchar. Exempel 4 matchar INTE. Förklaring: a - strängen måste börja på a b* - måste finnas finnas 0 eller flera b 31
Uppgift 4 Lösning tryreg("exempel 5", "a?b*", "abab"); tryreg("exempel 6", "a?b*", "bbbbbbb"); Utskrift: Exempel 5 matchar INTE. Exempel 6 matchar. Förklaring: a? - option, strängen måste antingen börja på a eller inte b* - resten av strängen måste bestå av 0 eller flera b abab innehåller a mellan b:na och därför matchar inte Strängen det reguljära uttrycket a?b* 32
Uppgift 4 Lösning tryreg("exempel 7", "a+b*", "abbbbbbb"); Utskrift: Exempel 7 matchar. Förklaring: a+ - strängen måste börja med ett eller a b* - resten av strängen måste bestå av 0 eller flera b 33
Uppgift 4 Lösning tryreg("exempel 8", "((aa) (bb)).*c.*", "aaaacc"); tryreg("exempel 9", "((aa) (bb)).*c.*", "bbaacc"); tryreg("exempel 10", "((aa) (bb)).*c.*", "baacc"); Utskrift: Exempel 8 matchar. Exempel 9 matchar. Exempel 10 matchar INTE. Förklaring: (aa bb) - strängen måste börja med aa eller bb.* - strängen fortsätter med vad som helst c - strängen fortsätter med ett c.* - strängen avslutas med vad som helst Strängen baacc börjar inte på aa eller bb så därför matchar strängen inte det reguljära uttrycket "((aa) (bb)).*c.*" 34
5a. Vilka strängar med längd mindre 4 matchar detta reguljä uttryck: ab?c*. 5b. Vilka strängar med längd mindre 4 matchar detta reguljära uttryck: a*+b 5c. Vilka strängar med längd mindre 4 matchar detta reguljä uttryck: (a*bc c*d?e)+ 35
5a. Vilka strängar med längd mindre 4 matchar detta reguljära uttryck: ab?c*. Lösning: Längd 1: a Längd 2: ab, ac Längd 3: abc, acc 36
5b. Vilka strängar med längd mindre 4 matchar detta reguljära uttryck: a*+b Lösning: Längd 1: b Längd 2: ab Längd 3: aab 37
5c. Vilka strängar med längd mindre 4 matchar detta reguljära uttryck: (a*bc c*d?e)+ Lösning: Längd 1: e Längd 2: bc, de, ee, ec, ed Längd 3: abc, bce, cde, cce, dee, eee, ebc, ece, ede 38
6. Skapa en klass för enkellänkade listor av Strängar (String) utan att använda Javas standardklasser för listor. I klassen ska det finnas en klass för noderna som länkas samman i listan. Motivera varför du skapar den som du gör! 39
Uppgift 6 - Lösning En enkellänkad listad består av noder. Varje nod Innehåller en sträng och en pekare till nästa nod. data next 3 data next 2 40
Uppgift 6 - Lösning En enkellänkad listad består av noder. Varje nod Innehåller en sträng och en pekare till nästa nod. private class Node { String data; Node next; Node(int v, Node n) { data=v; next=n; data next data next 3 2 41
Uppgift 6 - Lösning public class MyLinkedList{ // privat klass Node som håller reda på // noderna i listan. De klasserna som // använder MyLinkedList behöver inte veta // hur MyLinkedList är uppbyggd. private class Node { String data; Node next; public Node(String d, Node n) { data = d; next = n; // En instansvariabel som håller reda på // i vilken nod listan börjar i. Node start; 42
Uppgift 6 - Lösning public class MyLinkedList{ // Metod som placerar alla nya strängar // sist i listan. Behövs för att man // ska kunna lägga till i en lista. public void add(string s){ if(start == null) { start = new Node(s, start); else { Node currentnode = start; while (currentnode.next!= null) { currentnode = currentnode.next; currentnode.next = new Node(s, null); 43
Uppgift 6 - Lösning public class MyLinkedList{ // Metod som returnerar var strängen s är // någonstans i listan // Bra om man vill veta om en sträng s // finns i listan innan man lägger till den public int search(string s){ // kod i lab 1 // Metod som tar bort alla förekomster // av strängen s i listan // Bra om man ångrar att s finns i listan // och vill ta bort den (s är överflödig) public void delete(string s){ // kod i lab 1 44
7. Skriv koden för en klass som implementerar gränssnittet(interface7). Metoden decorder undersöker om en heltalen(int) i en array är ordnad från större tal till mindre tal och returnerar sant om så är fallet och falskt annars. public interface Interface7 { public boolean decorder(int[] array); 45
Uppgift 7 Lösning public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; 46
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 47
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 48
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i 49
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i i + 1 50
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i 51
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i i + 1 52
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i 53
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i i + 1 54
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 i 55
Uppgift 7 Lösning -Testkörning1 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 4 3 1 56
Uppgift 7 Lösning -Testkörning 2 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 5 3 1 57
Uppgift 7 Lösning -Testkörning 2 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 5 3 1 58
Uppgift 7 Lösning -Testkörning 2 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 5 3 1 i 59
Uppgift 7 Lösning -Testkörning 2 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 5 3 1 i i + 1 60
Uppgift 7 Lösning -Testkörning 2 public class Uppgift7 implements Inteface7 { public boolean decorder(int[] array) { if(array.length == 0 array.length == 1) return true; for(int i = 0; i < array.length-1; i++) if(array[i + 1] > array[i]) return false; return true; array: 4 5 3 1 i i + 1 61
8. Förklara hur ett binärt sökträd fungerar. Ge ett exempel vad man kan använda dem till. 62
Binärt sökträd - Exempel key 1 2 3 4 5 6 7 8 9 63
Binärt sökträd - Exempel key 1 2 3 4 5 6 7 8 9 key == 5? Färdigt key < 5? Sök i det vänstra barnet key > 5? Sök i det högra barnet 64
Binärt sökträd - Exempel key 5 1 2 3 4 6 7 8 9 key == 5? Färdigt key < 5? Sök i det vänstra barnet key > 5? Sök i det högra barnet 65
Binärt sökträd - Exempel key 5 1 2 3 4 6 7 8 9 key == 3? Färdigt key < 3? Sök i det vänstra barnet key > 3? Sök i det högra barnet 66
Binärt sökträd - Exempel key 5 3 6 7 8 9 1 2 4 key == 3? Färdigt key < 3? Sök i det vänstra barnet key > 3? Sök i det högra barnet 67
Binärt sökträd - Exempel key 5 3 6 7 8 9 2 4 1 key == 2? Färdigt Key < 2? Sök i det vänstra barnet Key > 2? Sök i det högra barnet 68
Binärt sökträd - Exempel key 5 3 6 7 8 9 2 4 1 key == 8? Färdigt key < 8? Sök i det vänstra barnet key > 8? Sök i det högra barnet 69
Binärt sökträd - Exempel key 5 3 8 2 4 6 7 9 1 key == 8? Färdigt key < 8? Sök i det vänstra barnet key > 8? Sök i det högra barnet 70
Binärt sökträd - Exempel key 5 3 8 2 4 7 9 1 6 key == 7? Färdigt key < 7? Sök i det vänstra barnet key > 7?Sök i det högra barnet 71
Binärt sökträd - Exempel 5 3 8 2 4 7 9 1 6 72
Binärt sökträd - ADT - Ett binärt sökträd består av noder med följande innehåll: - nyckel (key) - data - pekare till det vänstra barnet - pekare till det högra barnet Vänster barn key data Höger barn 73
Binärt sökträd - ADT 5 3 8 2 4 7 9 1 6 74
Träd - teor 5 3 8 2 4 7 9 1 6 ROT Den som finns högst upp i trädet Interna noder Noder som har en förälder och minst ett barn LÖV(TERMINAL) Noderna längst ner i trädet 75
Tree - Theory 5 3 8 2 4 7 9 1 6 ROT Den som finns högst upp i trädet Interna noder Noder som har en förälder och minst ett barn LÖV(TERMINAL) Noderna längst ner i trädet 76
Tree - Theory 5 3 8 2 4 7 9 1 6 ROT Den som finns högst upp i trädet Interna noder Noder som har en förälder och minst ett barn LÖV(TERMINAL) Noderna längst ner i trädet 77
Binärt sökträd - Teori Hur många jämförelser behöver vi använda innan vi hittat den rätta nyckeln(key)? Svar: I värsta fall behöver vi vandra i trädet till vi kommit ner till ett löv. 78
Binärt sökträd - Teori Hur många jämförelser behöver vi använda innan vi hittat den rätta nyckeln(key)? Svar: I värsta fall behöver vi vandra i trädet till vi kommit ner till ett löv. Notera: - Om trädet är obalanserat behöver vi O(n) jämförelser - Om trädet är balanserat behöver vi O(log (n)) jämförelser 79
Obalanserat träd - Exempel 1 2 3 4 5 6 7 8 9 Antal noder: 9 Höjd: 9 Söktid: O(n) 80
Balanserat träd - Exempel 5 3 8 2 4 7 9 1 6 Antal noder: 9 Höjd: 4 Söktid: O(log(n)) 81
Binära sökträd Användning Nycklarna i ett binärt sökträd lagras i en sorterad ordning och om trädet är balanserat, så kan vi förbättra söktiden till O(log (n)) 82