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