Datastrukturer: Arrayer Lista Kö Stack Komplexitet Mer om ADT'er Dagens föreläsning Kopierat material Kapitel 4 Kapitel 5 ADT'er igen... Varför skapa ADT'er? Varför gömma? Hur gömmer man? Funktionerna ADT_create() och ADT_destroy() Vem "äger"/ansvarar för minnet? Tråkiga effekter (d = a + b + c): d = rational_add(rational_add(a, b), c); Komplexitet Mäter hur effektiv algoritmer är eller hur mycket minne de använder O(1) konstant O(log n) logaritmisk O(n) linjär Baseras på antal element: n O(n log n) O(n2) O(n) – "värsta fallet" O(2 ) O(n)+O(n2) = O(n2) O(n!) O(n)*O(n2) = O(n3) n kvadratisk exponentiell Exempel: Finns summan i en array? Avgör om en två tal ur en osorterad array kan ge en viss summa Naiv lösning: int testSum(int *a, int n, int sum){ int i, j; Arrayen består av n tal Returnera 1 om summan finns, annars 0 for(i=0; i<n-1; i++) { for(j=i+1; j<n; j++) { if (a[i]+a[j]==sum) return 1; } } return 0; } // Komplexitet? En bättre lösning! int testSum(int *a, int n, int sum){ int b=0, e=n-1; // Sortera arrayen, kostar O(n log2 n) while ((b<e) && (a[b]+a[e] != sum)) { while ((b<e) && (a[b]+a[e] < sum)) b++; while ((b<e) && (a[b]+a[e] > sum)) e--; } return (a[b]+a[e] == sum); } // Komplexitet? // O(n log2 n) + O(n) = O(n log2 n) ! Datastrukturer Baserade på struktur: Baserade på beteende: Array (matris) Kö (prioritetskö) Lista Stack Träd Hashtabell Graf Mängd Arrayer Används generellt: när vi vet antalet element som ska lagras när element inte behöver stoppas in mellan andra element Enda datastruktur som har "direktstöd" i C Den är dock ingen ADT i C... Lista Listor används: när vi inte vet hur många element som ska lagras om vi ofta behöver stoppa in element mellan andra element struct link_ { void *data; struct link_ *next; }; Har nedanstående struktur Head Data Next Data Next Data Next NULL Info Info Info Lista-ADT struct link_; typedef struct link_ *List; // Skapar en tom lista void list_create(List *list); // Avallokerar hela listan, använder f på alla // data i listan void list_destroy(List list, void (*f)(List *l)); void *list_getData(List list, int n); void *list_remove(List list, int n); void list_insert(List list, void *data, int n); int list_size(List list); Andra typer av listor Dubbellänkade listor Cirkulära listor Sorterade listor Listor med extra pekare Stack Ta bort först Antal element Titta på först i kön Lägg till sist Typiska operationer: Typiska operationer: Kö Push Pop Peek Antal element på stacken