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

Preview:

DESCRIPTION

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

Citation preview

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

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

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

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

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

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

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

Π.χ.

Πίνακες

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

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

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

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

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

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

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

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

Πίνακες

Πίνακες στη 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]

Πίνακες

Πίνακες στη 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);

}

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

Πίνακες

Πίνακες στη 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;

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

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

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

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

μέγεθος του A

όπου

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

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

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

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

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

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

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

7

0

7

0

15

8

εισαγωγή με

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

διαγραφή με

7

0

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

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

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

για

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

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

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

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

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

node :

item

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

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

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

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

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

node :

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

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

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

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

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

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

node :

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

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

link head

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

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

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

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

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

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

node :

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

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

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

link head

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

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

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

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

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

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

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

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

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

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

x x->next

t

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

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

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

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

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

x->nextx

tt->next = x->next;

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

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

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

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

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

x

t x->next = t;

t->next = x->next;

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

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

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

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

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

x x->next

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

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

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

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

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

x x->next

t

t = x->next;

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

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

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

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

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

x

t

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

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

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

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

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

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

x

t

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

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

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

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

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

1

2

3

4

5

8

7

6

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

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

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

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

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

1

2

3

4

5

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

2

3

4

5

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

2

3

4

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

2

3

4

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

2

3

4

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

3

4

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

3

4

8

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

3

4

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

3

4

7

6

Π.χ. Ν=8, Μ=5

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

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

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

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

1

3

46

Π.χ. Ν=8, Μ=5

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

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

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

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

1

3

46

Π.χ. Ν=8, Μ=5

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

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

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

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

3

46

Π.χ. Ν=8, Μ=5

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

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

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

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

3

46

Π.χ. Ν=8, Μ=5

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

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

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

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

3

6

Π.χ. Ν=8, Μ=5

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

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

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

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

3

6

Π.χ. Ν=8, Μ=5

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

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

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

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

3

Π.χ. Ν=8, Μ=5

Πρόβλημα του 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);

}

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

5 2 12 8 1

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

ταξινόμηση

1 2 5 8 12

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

5 2 12 8 1

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

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

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

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

a

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

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

5 2 12 8 1

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

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

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

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

a

b

t

x

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

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

5

2 12 8 1

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

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

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

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

a

b

tx

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

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

5

2 12 8 1

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

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

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

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

a

b

t

x

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

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

2

12 8 1

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

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

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

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

a

b

tx

5

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

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

2

12 8 1

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

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

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

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

a

b

t

x

5

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

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

2

12 8 1

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

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

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

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

a

b

t

x

5

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

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

2

12 8 1

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

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

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

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

a

b

t

x

5

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

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

2

8 1

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

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

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

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

a

b

tx

5 12

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

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

2

8 1

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

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

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

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

a

b

t

x

5 12

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

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

2

8 1

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

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

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

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

a

b

t

x

5 12

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

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

2

8 1

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

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

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

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

a

b

t

x

5 12

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

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

2

1

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

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

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

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

a

b

tx

5 8 12

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

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

2

1

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

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

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

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

a

b

t

x

5 8 12

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

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

1

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

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

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

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

a

b

tx

2 5 8 12

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

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

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

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;

}

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

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

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

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

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

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

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

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

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

, όπου και

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

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

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

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

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

Λειτουργίες

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

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

συνόλου

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

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

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

1

2 3

4

56 7

8

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

πίνακας

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

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

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

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

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

dheadS

b a h

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

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

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

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

headSb d a h

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

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

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

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

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

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

το στοιχείο

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

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

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

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

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

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

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

xk

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

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

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

Χρόνος

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

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

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

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

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

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

Χρόνος

b d a h

x

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

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

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

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

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

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

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

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

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

b d a c

x

h

y

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

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

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

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

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

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

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

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

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

b d a c

p

h

q

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

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

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

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

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

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

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

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

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

b d a c

p

h

q v

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

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

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

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

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

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

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

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

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

b da c

p

h

q v

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

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

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

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

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

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

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

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

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

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

αντίστοιχα

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

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

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

αντίστοιχα

b d a h

4

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

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

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

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

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

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

αντίστοιχα

Απόδειξη

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

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

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

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

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

αντίστοιχα

Απόδειξη

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

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

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

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

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

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

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

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

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

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

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

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

αντίστοιχα

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

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

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

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

Παρατήρηση

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

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

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

b d a h4

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

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

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

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

1 2 3 4 5 6 7 8

Π.χ.

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

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

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

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

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

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

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

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

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

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

double Α[20][10];

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

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

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

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

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

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 με δυναμική κατανομή μνήμης

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

Υλοποίηση στη 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)-διάστατοι πίνακες

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

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

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

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

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];}

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

αν

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

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

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

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

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

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

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

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

αν

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

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

πίνακα V

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

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

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

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

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

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

πίνακα V

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

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

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

Χώρος =

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

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

Χώρος =

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

πίνακα V

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

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

Γράφημα

1 2

4 5

3

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

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

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

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

πλήθος ακμών

Γράφημα

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

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

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

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

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

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

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

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

1 2

4 5

3

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

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

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

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

Χώρος: bits

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

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

1 2

4 5

3

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

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

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

Χώρος: bits

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

Λίστες γειτνίασης (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

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

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

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

2

3

4

5

2

3 5

1

1 3

4

1 2

4 5

3

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

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

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

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

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

Λίστες γειτνίασης (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

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

1 2

3 4

5 6

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

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

1 2

3 4

5 6

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

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

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

srand(seed);

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

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

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

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

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

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

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

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);

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

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

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

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

Recommended