270 likes | 401 Views
Begreber og Redskaber 6. BRP. Plan for idag. Tabeller Udvalgssortering, køretid Lidt mere om objekter Budskab: Køretid kan være et problem og bør løses med bedre algoritmer. Tabeller/Arrays. int[] tabel = new int[100]; tabel[0]=1; tabel[99]=117; for(int i=0;i<tabel.length;i++)
E N D
Plan for idag • Tabeller • Udvalgssortering, køretid • Lidt mere om objekter • Budskab: Køretid kan være et problem og bør løses med bedre algoritmer
Tabeller/Arrays int[] tabel = new int[100]; tabel[0]=1; tabel[99]=117; for(int i=0;i<tabel.length;i++) tabel[i]=i*29; Erklæring, konstruktion, initialisering
Tabeller • Underprogrammer static void fill(int[] t, int v){ for(int i=0;i<t.length;i++)t[i]=v; } ... main(…){ int[] tabel=new int[100]; fill(tabel,23); int[] tabel1=new int[10000]; fill(tabel1,0); }
Køretid static void fill(int[] t, int v){ for(int i=0;i<t.length;i++)t[i]=v; } • Køretid proportional med længden af tabellen – jo større tabel, jo længere tid tager det. • O(n) hvor n er størrelsen af inddata • Eksempler: O(n2) O(2n) O(n log(n))
Sortering En vilkårlig liste af heltal [11, 9, 17, 5, 12] ønskes sorteret [5, 9, 11, 12, 17]
Udvalgssortering Det mindste element og det forreste element [11, 9, 17, 5, 12] ombyttes. I den resulterende liste [5, 9, 17, 11, 12] er det forreste element korrekt placeret [5, 9, 17, 11, 12] Sådan fortsættes
Udvalgssortering [11, 9, 17, 5, 12] [5, 9, 17, 11, 12] [5, 9, 17, 11, 12] [5, 9,11, 17, 12] [5, 9,11, 12, 17] [5, 9,11, 12, 17]
Udvalgssortering public static void sort(int[] a){ for (int i=0; i<a.length-1; i++){ int minPos = minimumPosition(a,i); if (minPos!=i){ int temp = a[minPos]; a[minPos] = a[i]; a[i] = temp; } } }
Hjælpeprogram til udvalgssortering public static int minimumPosition(int[] a, int from){ int minPos = from; for (int i=from+1; i<a.length; i++) if (a[i]<a[minPos]) minPos = i; return minPos; }
Figure 1 Time Taken by Selection Sort Bemærk køretid bliver hastigt lang for store tabeller
Køretid for udvalgssortering • Husk public static void sort(int[] a){ for (int i=0; i<a.length-1; i++){ int minPos = minimumPosition(a,i); . . . public static int minimumPosition(int[] a, int from){ for (int i=from+1; i<a.length; i++) . . . Groft overslag: Lad n være a.length. for-løkke i sort gennemløbes ca n-gange. Hver gang kaldes minimumPositionder har optil n gennemløb. Altså n*n gennemløb eller O(n2)
Lidt mere præcist • Første gang minimumPosition kaldes er der n-1 gennemløb, anden gang n-2 gennemløb, osv (n-1)+(n-2)+(n-3)+…+1 = n * (n-1) * 0.5 ca = n2 altså O(n2)
Eksempel Antal sammenligninger (<): Tabel med 1000 udvalgssortering: 499500 Flettesortering: 8706 Tabel med 10000 udvalgssortering: 49995000 Flettesortering: 120472
Køretider • Eksempler: • O(n2) O(2n) O(n log(n)) • Kvadratisk, eksponentiel, næsten lineær • Gode algoritmer: lineær, næsten lineær • Ubruglige algoritmer: eksponentiel
Logaritmer • Det omvendte af potenser 105=100000 100=1 log10(100000)=5 log10(1)=0 28=256 20=1 log2(256)=8 log2(1)=0 • Regne med potenser og logaritmer an+m=an * am log(n * m)=log(n)+log(m)
Logaritmer • Hvor mange gange skal man knække et 256 meter langt rør midt over for at få et 1 meter langt stykke? • Du tænker på et tal mellem 1 og 256. Hvor mange ja/nej spørgsmål skal jeg stille for at gætte det?
Overblik over objekter i Java • Parametre til underprogrammer • Data beskyttelse • Statiske felter • Nedarvning • Overskrivning
public/private • Synlighed: Felter og metoder kan være private for en klasser – usynlige udenfor class A{ private int i,j; public int getI(){return i;} public void setI(int x){i=x;} } // A a = new A(); // a.i=3 ej ok , a.setI(3) ok
Accessor/mutator • God stil: Felter gøres private • Værdier hentes med accessormetoder • Felter ændres med mutatormetoder accessor: public int getI(){return i;} mutator public void setI(int x){i=x;}
Statiske felter class A{ static private int nr=0; A(){nr++;} static int getNr(){return nr;} } System.out.println(A.getNr()); A a = new A(); System.out.println(a.getNr());
Initialisering af statiske felter class A{ static int i; static { i = 0; } } Statisk initialiseringsblok – Udføres når programmet starter (i god tid før objekter oprettes)
Nedarvning class A{ int i; } class B extends A { int j;} //B er subtype af A A a = new A(); a.i = 1; B b = new B(); b.i = 1; b.j = 2; A aa = new B(); aa.i = 1; //ej aa.j // ej B bb = new A();
Subtyper A a = new A(); a.i = 1; B b = new B(); b.i = 1; b.j = 2; A aa = new B(); aa.i = 1; //ej aa.j b = (B) aa; // casting - typecheck b = (B) a; // køretidsfejl if(aa instanceof B) b = (B) aa; //typecheck
Subtyper A a; B b = new B(); a = b; // ingen casting b = (B) a // casting nødvendig A er supertype for B, B subtype af A Værdier af subtype må bruges som supertype
Overskrivning (overwriting) class A{ void hej(){System.out.println(”AA”);} } class B extends A{ void hej(){System.out.println(”BB”);} } A a = new A(); a.hej(); // AA B b = new B(); b.hej(); // BB A c = new B(); c.hej(); // BB I B: void hej1(){super.hej();} b.hej1(); // AA ((B) c).hej1(); // AA
Rekursive datastrukturer class Liste{ int i Liste naeste; Liste(int ii,Liste nn){i=ii;naeste=n;} } Liste list=new Liste(1,new Liste(2,null));