98
Στοιχειώδεις Δομές Δεδομένων Τύποι δεδομένων στη C Ακέραιοι (int, long) Αριθμοί κινητής υποδιαστολής (float, double) Χαρακτήρες (char) Από τους παραπάνω μπορούμε να φτιάξουμε σύνθετους τύπους typedef struct { float x; float y; } point; Π.χ.

Στοιχειώδεις Δομές Δεδομένων

Embed Size (px)

DESCRIPTION

Στοιχειώδεις Δομές Δεδομένων. Τύποι δεδομένων στη C. Ακέραιοι ( int , long ) Αριθμοί κινητής υποδιαστολής ( float , double ) Χαρακτήρες ( char ). Από τους παραπάνω μπορούμε να φτιάξουμε σύνθετους τύπους. Π.χ. typedef struct { float x; float y; } point;. TexPoint fonts used in EMF. - PowerPoint PPT Presentation

Citation preview

Page 1: Στοιχειώδεις Δομές Δεδομένων

Στοιχειώδεις Δομές Δεδομένων

Τύποι δεδομένων στη C

• Ακέραιοι (int, long)

• Αριθμοί κινητής υποδιαστολής (float, double)

• Χαρακτήρες (char)

Από τους παραπάνω μπορούμε να φτιάξουμε σύνθετους τύπους

typedef struct { float x; float y; } point;

Π.χ.

Page 2: Στοιχειώδεις Δομές Δεδομένων

Πίνακες

• Σύνολο στοιχείων ιδίου τύπου

Π.χ. πίνακας ακεραίων, πίνακας δεικτών σε ακέραιους, …

• Συνεχόμενες θέσεις στη μνήμη

Το i-oστο στοιχείο Α[i-1] βρίσκεται στη θέση X + (i-1)*L, όπου Χ η

θέση του πρώτου στοιχείου Α[0] και L το μέγεθος του κάθε στοιχείου

• Αναφορά με χρήση ακέραιου δείκτη

Π.χ. ανάθεση τιμής στο 3ο στοιχείο του πίνακα Α[2]=t;

Πίνακας (array) Α με στοιχεία τύπου T

Page 3: Στοιχειώδεις Δομές Δεδομένων

Πίνακες

Πίνακες στη C

#define N 1000

void initialize(int A[]){

int i;for (i=0; i<N; i++) A[i]=0;

}

void main(){

int A[N];initialize(A);

}

Στατική κατανομή μνήμης

Στην C, το όνομα ενός πίνακα είναι δείκτης στο 1ο στοιχείο του Α[0]

Page 4: Στοιχειώδεις Δομές Δεδομένων

Πίνακες

Πίνακες στη C

void initialize(int *A, int N){

A = malloc(N*sizeof(int));for (i=0; i<N; i++) A[i]=0;

}

void main(){

int *A; int N; read(N);initialize(A,N);

}

Δυναμική κατανομή μνήμης

Page 5: Στοιχειώδεις Δομές Δεδομένων

Πίνακες

Πίνακες στη C

void initialize(int *A, int N){

A = malloc(N*sizeof(int));for (i=0; i<N; i++) A[i]=0;

}

void main(){

int *A; int N; read(N);initialize(A,N);

}

Δυναμική κατανομή μνήμης

Τι γίνεται αν δε γνωρίζουμεεκ των προτέρων τηv τιμή του N;

Page 6: Στοιχειώδεις Δομές Δεδομένων

Δυναμικοί πίνακες

Δυναμικοί πίνακες με εισαγωγές και διαγραφές

Συντελεστής πληρότητας πίνακα A :

πλήθος αποθηκευμένων στοιχείων στον A

μέγεθος του A

όπου

Επιθυμητές ιδιότητες :

α) περιορισμένη σπατάλη χώρου : σταθερά

β) μικρό συνολικό κόστος για οποιαδήποτε ακολουθία πράξεων

Για να πετύχουμε την ιδιότητα (α) πρέπει να αντιγράφουμε

τα στοιχεία σε μικρότερο πίνακα μετά από αρκετές διαγραφές

Page 7: Στοιχειώδεις Δομές Δεδομένων

Δυναμικοί πίνακες

Δυναμικοί πίνακες με εισαγωγές και διαγραφές

7

0

7

0

15

8

εισαγωγή με

διπλασιασμός

διαγραφή με

7

0

υποδιπλασιασμός

Επιτυγχάνει και

συνολικό κόστος

για

εισαγωγές/διαγραφές

Page 8: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

node :

item

next : δείκτης σε κόμβο τύπου node

Page 9: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

node :

item μηδενικόςσύνδεσμος (NULL)

next : δείκτης σε κόμβο τύπου node

Page 10: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

node :

item μηδενικόςσύνδεσμος (NULL)

next : δείκτης σε κόμβο τύπου node

link head

Για να προσπελάσουμε τα στοιχεία της λίστας χρειαζόμαστε ένα δείκτη στον πρώτο

κόμβο της λίστας. Ο δείκτης αποθηκεύεται στη μεταβλητή head (τύπου link).

Page 11: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

node :

item σύνδεσμος προς τον πρώτο κόμβο

κυκλική λίστα

next : δείκτης σε κόμβο τύπου node

link head

Σε ορισμένες περιπτώσεις που θέλουμε να επεξεργαστούμε τα στοιχεία της λίστας

πολλαπλές φορές είναι βολικό να κάνουμε τη λίστα κυκλική

Page 12: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

node :

item

δημιουργία νέου κόμβου link x = malloc(sizeof *x);

next : δείκτης σε κόμβο τύπου node

x x->item = πεδίο item του κόμβου που δείχνει ο x

x->next = πεδίο next του κόμβου που δείχνει ο x

Page 13: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Εισαγωγή του κόμβου t μετά το x

x x->next

t

Page 14: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Εισαγωγή του κόμβου t μετά το x

x->nextx

tt->next = x->next;

Page 15: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Εισαγωγή του κόμβου t μετά το x

x

t x->next = t;

t->next = x->next;

Page 16: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Διαγραφή του κόμβου μετά το x

x x->next

Page 17: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Διαγραφή του κόμβου μετά το x

x x->next

t

t = x->next;

Page 18: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Διαγραφή του κόμβου μετά το x

x

t

t = x->next; x->next = t->next;

Page 19: Στοιχειώδεις Δομές Δεδομένων

Συνδεδεμένες Λίστες

Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους.

typedef struct node *link;struct node {Item item; link next;};

Κάθε κόμβος περιλαμβάνει ένα σύνδεσμο προς τον επόμενο κόμβο.

Διαγραφή του κόμβου μετά το x

x

t

t = x->next; x->next = t->next;free(t);

Page 20: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

2

3

4

5

8

7

6

Π.χ. Ν=8, Μ=5αρχική θέση

Page 21: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

2

3

4

5

8

7

6

Π.χ. Ν=8, Μ=5

Page 22: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

2

3

4

5

8

7

6

Π.χ. Ν=8, Μ=5

Page 23: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

2

3

4

8

7

6

Π.χ. Ν=8, Μ=5

Page 24: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

2

3

4

8

7

6

Π.χ. Ν=8, Μ=5

Page 25: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

2

3

4

8

7

6

Π.χ. Ν=8, Μ=5

Page 26: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

3

4

8

7

6

Π.χ. Ν=8, Μ=5

Page 27: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

3

4

8

7

6

Π.χ. Ν=8, Μ=5

Page 28: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

3

4

7

6

Π.χ. Ν=8, Μ=5

Page 29: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

3

4

7

6

Π.χ. Ν=8, Μ=5

Page 30: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

3

46

Π.χ. Ν=8, Μ=5

Page 31: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

1

3

46

Π.χ. Ν=8, Μ=5

Page 32: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

3

46

Π.χ. Ν=8, Μ=5

Page 33: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

3

46

Π.χ. Ν=8, Μ=5

Page 34: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

3

6

Π.χ. Ν=8, Μ=5

Page 35: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

3

6

Π.χ. Ν=8, Μ=5

Page 36: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

3

Π.χ. Ν=8, Μ=5

Page 37: Στοιχειώδεις Δομές Δεδομένων

Πρόβλημα του Josephus

Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν.

Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο.

Στον τελευταίο που θα μείνει δίνεται χάρη.

#include <stdlib.h>typedef struct node *link; struct node {int item; link next;};main(int argc, char *argv[]){

int i, N=atoi(argv[1]), M=atoi(argv[2]);link t=malloc(sizeof *t), x=t;t->item=1; t->next=t;for (i=2; i<=N; i++){

x=(x->next=malloc(sizeof *x));x->item=i; x->next=t;

}while (x!=x->next){

for (i=1; i<M; i++) x=x->next;x->next=x->next->next; N--;

}printf(“%d\n”, x->item);

}

Page 38: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

5 2 12 8 1

Μη διατεταγμένη λίστα

ταξινόμηση

1 2 5 8 12

Page 39: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

5 2 12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

bψευδο-κόμβοι κεφαλής

Page 40: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

5 2 12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 41: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

5

2 12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

tx

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 42: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

5

2 12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 43: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

tx

5

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 44: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 45: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 46: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

12 8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 47: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

tx

5 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 48: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 49: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 50: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

8 1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 51: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

tx

5 8 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 52: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

2

1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

t

x

5 8 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 53: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

1

Ταξινόμηση με εισαγωγή

Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη.Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας

Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής.Μέχρι να αδειάσει η a

διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b.

a

b

tx

2 5 8 12

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

Page 54: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

Ταξινόμηση με εισαγωγή

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

struct node heada, headb;link a = &heada;

.../* construct list a */...

/* sort list */a = &heada;link b = &headb; b->next = NULL;link t, u, x; for (t = a->next; t != NULL; t = u){

u = t->next;for (x = b; x->next != NULL; x = x->next)

if (x->next->item > t->item) break;t->next = x->next; x->next = t;

}

Page 55: Στοιχειώδεις Δομές Δεδομένων

Ταξινόμηση Συνδεδεμένης Λίστας

Ταξινόμηση με εισαγωγή

t = επόμενος κόμβος της ax = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next

struct node heada, headb;link a = &heada;

.../* construct list a */...

/* sort list */a = &heada;link b = &headb; b->next = NULL;link t, u, x; for (t = a->next; t != NULL; t = u){

u = t->next;for (x = b; x->next != NULL; x = x->next)

if (x->next->item > t->item) break;t->next = x->next; x->next = t;

}

2

8 1a

b

t

5 12

x

u

Page 56: Στοιχειώδεις Δομές Δεδομένων

Διπλά Συνδεδεμένη Λίστα

διπλά συνδεδεμένη λίστα

typedef struct node *link;struct node {Item item; link next; link previous;};

διπλά συνδεδεμένη κυκλική λίστα

Page 57: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Διατηρούμε ξένα μεταξύ τους σύνολα που είναι υποσύνολα ενός

, όπου και

Δημιουργεί νέο σύνολο με μόνο στοιχείο το

Έστω το σύνολο που περιέχει το και έστω το

σύνολο που περιέχει το . Δημιουργεί ένα νέο σύνολο

και διαγράφει τα και

Επιστρέφει το όνομα του συνόλου που περιέχει το

Λειτουργίες

Ως «όνομα» ενός συνόλου μπορούμε να ορίσουμε ένα στοιχείο που να αποτελεί

τον «αντιπρόσωπο» του συνόλου

συνόλου

Page 58: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Έχουμε δει αποδοτικές δομές εύρεσης-ένωσης που αναπαριστούν τα σύνολα με

ένα μόνο πίνακα

1

2 3

4

56 7

8

δέντρο ένωσης-εύρεσης

πίνακας

Εδώ θα σχεδιάσουμε μια δομή εύρεσης-ένωσης με συνδεδεμένες λίστες η οποία

θα μας επιτρέπει επιπλέον να βρίσκουμε γρήγορα όλα τα στοιχεία ενός συνόλου

Page 59: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

dheadS

b a h

Π.χ. για το σύνολο με αντιπρόσωπο

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

typedef struct node *link;struct node {Item item; link next; link rep};

headSb d a h

Page 60: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Τώρα τα ορίσματα που δέχονται και οι τιμές που επιστρέφουν οι λειτουργίες

και είναι δείκτες σε κόμβους

Η λειτουργία επιστρέφει ένα δείκτη σε νέο κόμβο που αποθηκεύει

το στοιχείο

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Page 61: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

xk

Δημιουργεί νέο κόμβο που αποθηκεύει το στοιχείο k και επιστρέφει

δείκτη x στον κόμβο

link x = malloc(sizeof *x);x->item = k;x->next = NULL;x->rep = x;

Χρόνος

Page 62: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Επιστρέφει το δείκτη x->rep

Χρόνος

b d a h

x

Page 63: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και

για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος

συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p.

Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το

b d a c

x

h

y

Page 64: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και

για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος

συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p.

Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το

b d a c

p

h

q

Page 65: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και

για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος

συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p.

Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το

b d a c

p

h

q v

Page 66: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και

για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος

συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p.

Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το

b da c

p

h

q v

Page 67: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον

αντιπρόσωπο του στην κορυφή της λίστας

Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε

στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο

Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και

για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος

συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p.

Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται

όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το

αντίστοιχα

Page 68: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται

όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το

αντίστοιχα

b d a h

4

Τώρα πρέπει να αποθηκεύουμε και τον αριθμό των στοιχείων του κάθε συνόλου,

π.χ. σε ξεχωριστό κόμβο-κεφαλή που παίζει το ρόλο του αντιπρόσωπου

Άσκηση: Δώστε τις λεπτομέρειες αυτής της δομής, ειδικά το πως υλοποιείται η

Page 69: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται

όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το

αντίστοιχα

Απόδειξη

Αν ισχύει ο παραπάνω χρόνος για μια ένωση, τότε ενώσεις γίνονται σε χρόνο

όπου ο συνολικός αριθμός των στοιχείων

Page 70: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται

όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το

αντίστοιχα

Απόδειξη

Έστω . Τότε η εκτελείται σε χρόνο και το νέο σύνολο

που προκύπτει έχει στοιχεία. Το κόστος επιμερίζεται σε κόστος

ανά στοιχείο που αλλάζει δείκτη σε αντιπρόσωπο.

Επομένως αν το συμμετέχει στο μικρότερο σύνολο σε ενώσεις τότε το νέο σύνολο

που περιέχει το θα έχει στοιχεία. Όμως οπότε . Άρα το

συνολικό κόστος ανά στοιχείο είναι .

Αφού έχουμε στοιχεία το συνολικό κόστος είναι

Αν ισχύει ο παραπάνω χρόνος για μια ένωση, τότε ενώσεις γίνονται σε χρόνο

όπου ο συνολικός αριθμός των στοιχείων

Page 71: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται

όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το

αντίστοιχα

Αν ισχύει ο παραπάνω χρόνος για μια ένωση, τότε ενώσεις γίνονται σε χρόνο

όπου ο συνολικός αριθμός των στοιχείων

Ο παράγοντας στο χρόνο αντιστοιχεί στο κόστος εύρεσης

των αντιπροσώπων των συνόλων που ενώνονται

Παρατήρηση

Με βάση τα παραπάνω καταλήγουμε στο συμπέρασμα ότι οποιαδήποτε ακολουθία από

λειτουργίες και λειτουργίες και απαιτεί συνολικό χρόνο

Page 72: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

b d a h4

Ερώτημα : Πως μπορούμε να βρούμε τον κόμβο που περιέχει ένα στοιχείο ;

Αν τα στοιχεία είναι μικροί ακέραιοι (π.χ. ) τότε μπορούμε να

αποθηκεύσουμε ένα πίνακα δεικτών όπου η θέση δείχνει στον κόμβο που

αντιστοιχεί στο στοιχείο

1 2 3 4 5 6 7 8

Π.χ.

Page 73: Στοιχειώδεις Δομές Δεδομένων

Δομή Εύρεσης-Ένωσης με Λίστες

Ερώτημα : Πως μπορούμε να βρούμε τον κόμβο που περιέχει ένα στοιχείο ;

Αν τα στοιχεία είναι μικροί ακέραιοι (π.χ. ) τότε μπορούμε να

αποθηκεύσουμε ένα πίνακα δεικτών όπου η θέση δείχνει στον κόμβο που

αντιστοιχεί στο στοιχείο

Διαφορετικά χρειαζόμαστε μια δομή αναζήτησης (λεξικό), π.χ. δένδρο αναζήτησης

ή πίνακας διασποράς. Προσεχώς…

Page 74: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Πίνακες (μήτρες) στη γραμμική άλγεβρα

Υλοποίηση στη C με στατική κατανομή μνήμης

double Α[20][10];

Γενικά για πίνακα με d διαστάσεις

double Α[k1][k2]...[kd];

όπου k1,...,kd θετικοί ακέραιοι

Page 75: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Πίνακες (μήτρες) στη γραμμική άλγεβρα

double **Α = malloc2d(m,n);

double **malloc2d(int r, int c){ int i;double **Α = malloc(r * sizeof(double *));for (i = 0; i < r; i++)

Α[i] = malloc(c * sizeof(double));return Α;

}

Υλοποίηση στη C με δυναμική κατανομή μνήμης

Page 76: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Υλοποίηση στη C με δυναμική κατανομή μνήμης

double **Α = malloc2d(m,n);

double **malloc2d(int r, int c){ int i;double **A = malloc(r * sizeof(double *));for (i = 0; i < r; i++)

A[i] = malloc(c * sizeof(double));return A;

}A

A[i]A[i][j] Στη C, ένας d-διάστατος πίνακας

ορίζεται ως ένας μονοδιάστατος

πίνακας με στοιχεία που

είναι (d-1)-διάστατοι πίνακες

Page 77: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Πολλαπλασιασμός πινάκων

Page 78: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Πολλαπλασιασμός πινάκων

for (i = 0; i < p; i++)for (j = 0; j < r; j++){

C[i][j]=0;for (k = 0; k < q; k++){

C[i][j] += A[i][k]*B[k][j];}

}

Εκτελεί πράξεις

Page 79: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθήκευση διδιάστατου πίνακα ως μονοδιάστατου

Αποθήκευση κατά γραμμές

Το στοιχείο Α[i,j] βρίσκεται στη θέση X + (i*q+j)*L, όπου Χ η θέση του

πρώτου στοιχείου Α[0,0] και L το μέγεθος του κάθε στοιχείου

Page 80: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθήκευση διδιάστατου πίνακα ως μονοδιάστατου

Αποθήκευση κατά στήλες

Το στοιχείο Α[i,j] βρίσκεται στη θέση X + (i+j*p)*L, όπου Χ η θέση του

πρώτου στοιχείου Α[0,0] και L το μέγεθος του κάθε στοιχείου

Page 81: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθήκευση διδιάστατου πίνακα ως μονοδιάστατου

Σε πολλές εφαρμογές προκύπτουν πίνακες με ειδική μορφή. Μπορούμε να

αποθηκεύσουμε τα στοιχεία ενός τέτοιοι πίνακα σε ένα μονοδιάστατο πίνακα

για εξοικονόμηση χώρου.

Συμμετρικοί πίνακες

Συμπιεσμένη αποθήκευση κατά γραμμές

Page 82: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθήκευση διδιάστατου πίνακα ως μονοδιάστατου

Σε πολλές εφαρμογές προκύπτουν πίνακες με ειδική μορφή. Μπορούμε να

αποθηκεύσουμε τα στοιχεία ενός τέτοιοι πίνακα σε ένα μονοδιάστατο πίνακα

για εξοικονόμηση χώρου.

Συμμετρικοί πίνακες

Συμπιεσμένη αποθήκευση κατά γραμμές

Αριθμός στοιχείων =

Page 83: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθήκευση διδιάστατου πίνακα ως μονοδιάστατου

Σε πολλές εφαρμογές προκύπτουν πίνακες με ειδική μορφή. Μπορούμε να

αποθηκεύσουμε τα στοιχεία ενός τέτοιοι πίνακα σε ένα μονοδιάστατο πίνακα

για εξοικονόμηση χώρου.

Άνω τριγωνικοί πίνακες

Συμπιεσμένη αποθήκευση κατά γραμμές

Αριθμός στοιχείων =

αν

Page 84: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθήκευση διδιάστατου πίνακα ως μονοδιάστατου

Σε πολλές εφαρμογές προκύπτουν πίνακες με ειδική μορφή. Μπορούμε να

αποθηκεύσουμε τα στοιχεία ενός τέτοιοι πίνακα σε ένα μονοδιάστατο πίνακα

για εξοικονόμηση χώρου.

Κάτω τριγωνικοί πίνακες

Συμπιεσμένη αποθήκευση κατά γραμμές

Αριθμός στοιχείων =

αν

Page 85: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αποθηκεύουμε τα μη μηδενικά στοιχεία διαδοχικά ανά γραμμές σε μονοδιάστατο

πίνακα V

Επιπλέον αποθηκεύουμε τη στήλη και γραμμή που αντιστοιχεί σε κάθε μη μηδενικό

στοιχείο σε μονοδιάστατους πίνακες col και row

Αραιοί πίνακες με μη μηδενικά στοιχεία

Page 86: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αραιοί πίνακες

Αποθηκεύουμε τα μη μηδενικά στοιχεία διαδοχικά ανά γραμμές σε μονοδιάστατο

πίνακα V

με μη μηδενικά στοιχεία

Επιπλέον αποθηκεύουμε τη στήλη και γραμμή που αντιστοιχεί σε κάθε μη μηδενικό

στοιχείο σε μονοδιάστατους πίνακες col και row

Χώρος =

Page 87: Στοιχειώδεις Δομές Δεδομένων

Σύνθετες Δομές Δεδομένων

Αραιοί πίνακες με μη μηδενικά στοιχεία

Χώρος =

Αποθηκεύουμε τα μη μηδενικά στοιχεία διαδοχικά ανά γραμμές σε μονοδιάστατο

πίνακα V

Εναλλακτικά, αντί για τον πίνακα γραμμών row, αποθηκεύουμε έναν άλλο μονοδιάστατο

πίνακα rowptr που δίνει τη θέση που ξεκινά στον V η κάθε γραμμή του Α

Page 88: Στοιχειώδεις Δομές Δεδομένων

Γράφημα

1 2

4 5

3

Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα:

• Σύνολο κορυφών (vertex set)

• Σύνολο ακμών (edge set)

πλήθος κορυφών

πλήθος ακμών

Page 89: Στοιχειώδεις Δομές Δεδομένων

Γράφημα

Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα:

• Σύνολο κορυφών (vertex set)

• Σύνολο ακμών (edge set)

Μερικά είδη γραφημάτων:

• Κατεύθυνση ακμών- μη κατευθυνόμενα - κατευθυνόμενα

• Βάρος ακμών- μη σταθμισμένα- σταθμισμένα

Page 90: Στοιχειώδεις Δομές Δεδομένων

Αναπαράσταση Γραφήματος

Μήτρα γειτνίασης (adjacency matrix):

1 2

4 5

3

Χρησιμοποιούμε έναν πίνακα Α, όπου

συμμετρικός πίνακας

Ελέγχουμε αν σε χρόνο

Επεξεργαζόμαστε όλες τις ακμές σε χρόνο

Χώρος: bits

Page 91: Στοιχειώδεις Δομές Δεδομένων

Αναπαράσταση Γραφήματος

Μήτρα γειτνίασης (adjacency matrix):

1 2

4 5

3

Χρησιμοποιούμε έναν πίνακα Α, όπου

Ελέγχουμε αν σε χρόνο

Επεξεργαζόμαστε όλες τις ακμές σε χρόνο

Χώρος: bits

Page 92: Στοιχειώδεις Δομές Δεδομένων

Αναπαράσταση Γραφήματος

Λίστες γειτνίασης (adjacency lists):

1 2

4 5

3

Χρησιμοποιούμε έναν πίνακα Α, όπου είναι δείκτης σε λίστα

Χώρος: λέξεις

Ελέγχουμε αν σε χρόνο

Επεξεργαζόμαστε όλες τις ακμές σε χρόνο

1

2

3

4

5

2 3 4

1 3 5

1 2 4

1 3 5

2 4

των κόμβων που γειτονεύουν με τον κόμβο i

Κάθε ακμή εμφανίζεται 2 φορές

A

Page 93: Στοιχειώδεις Δομές Δεδομένων

Αναπαράσταση Γραφήματος

Λίστες γειτνίασης (adjacency lists):

Χώρος: λέξεις1

2

3

4

5

2

3 5

1

1 3

4

1 2

4 5

3

Ελέγχουμε αν σε χρόνο

Επεξεργαζόμαστε όλες τις ακμές σε χρόνο

Χρησιμοποιούμε έναν πίνακα Α, όπου είναι δείκτης σε λίστα

των κόμβων που γειτονεύουν με τον κόμβο iA

Page 94: Στοιχειώδεις Δομές Δεδομένων

Αναπαράσταση Γραφήματος

Λίστες γειτνίασης (adjacency lists):

#define N 6typedef struct node *link;struct node { int v; link next; }

link NEW(int v, link next){ link x = malloc(sizeof *x);

x->v = v; x->next = next;return x; }

main(){ int i,j; link adj[N];

for (i = 0; i < N; i++) adj[i] = NULL;while (scanf(“%d %d\n”, &i, &j) == 2){

adj[j] = NEW(i, adj[j]);adj[i] = NEW(j, adj[i]);

}}

Διαβάζει μη κατευθυνόμενο γράφημα

1

2

3

4

5

2 3 4

1 3 5

1 2 4

1 3 5

2 4

adj

Page 95: Στοιχειώδεις Δομές Δεδομένων

Τυχαία Γραφήματα

1 2

3 4

5 6

Επιλέγουμε ακμές τυχαία (από κάποια κατανομή) σε γράφημα με κόμβους

Page 96: Στοιχειώδεις Δομές Δεδομένων

Τυχαία Γραφήματα

1 2

3 4

5 6

Επιλέγουμε ακμές τυχαία (από κάποια κατανομή) σε γράφημα με κόμβους

Page 97: Στοιχειώδεις Δομές Δεδομένων

Τυχαία Γραφήματα

Ομοιόμορφα τυχαία επιλογή κόμβων

srand(seed);

for(i=0; i<m; i++){ j = (rand() % n) + 1; k = (rand() % n) + 1; addEdge(j,k);}

Eπιλέγουμε ομοιόμορφα τυχαία τους δύο κόμβους της κάθε ακμής από τους

κόμβους του γραφήματος

Κατασκευάζει γράφημα με κόμβους και ακμές αλλά μπορεί να

περιέχει βρόχους και πολλαπλές (επαναλαμβανόμενες) ακμές

βρόχοςδιπλή ακμή

Page 98: Στοιχειώδεις Δομές Δεδομένων

Τυχαία Γραφήματα

srand(seed);double p = (double) 2*m/(n*(n-1));

for (k=1; k<=n; k++) for (j=1; j<k; j++) if ( rand() < p*RAND_MAX ) addEdge(j,k);

Το παρακάτω πρόγραμμα επιλέγει κάθε μια από τις δυνατές

ακμές με πιθανότητα

Ομοιόμορφη δειγματοληψία

Κατασκευάζει γράφημα με κόμβους και αναμενόμενο αριθμό ακμών