Στοιχειώδεις Δομές Δεδομένων TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Τύποι δεδομένων στη 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 υποδιπλασιασμός Επιτυγχάνει και συνολικό κόστος για εισαγωγές/διαγραφές
Συνδεδεμένες Λίστες Συνδεδεμένη λίστα: Αποθηκεύει ένα σύνολο στοιχείων σε κόμβους. 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->next x t t->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 Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5 αρχική θέση
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη. 3 6 Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη. 3 6 Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη. 3 Π.χ. Ν=8, Μ=5
Πρόβλημα του Josephus Ν άτομα στέκονται σε ένα κύκλο και περιμένουν να εκτελεστούν. Σε κάθε βήμα εκτελείται το Μ-οστό άτομο όπως διατρέχουμε τον κύκλο. Στον τελευταίο που θα μείνει δίνεται χάρη. #include 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 next; x->next=x->next->next; N--; } printf(“%d\n”, x->item); }
Ταξινόμηση Συνδεδεμένης Λίστας Μη διατεταγμένη λίστα ταξινόμηση
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b ψευδο-κόμβοι κεφαλής
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b tx t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 5 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 5 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 5 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 5 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 2 81 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b tx 512 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 2 81 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 512 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 2 81 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 512 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 2 81 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 512 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 2 1 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b tx 5812 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 2 1 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x 5812 t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας 1 Ταξινόμηση με εισαγωγή Έστω a η αρχική λίστα. Διατηρούμε μία ακόμα λίστα b που θα είναι διατεταγμένη. Για ευκολία τοποθετούμε ένα ψευδο-κόμβο κεφαλής στην αρχή κάθε λίστας Αρχικά η b περιλαμβάνει μόνο τον ψευδο-κόμβο κεφαλής. Μέχρι να αδειάσει η a διαγράφουμε το πρώτο στοιχείο της a και το εισάγουμε στη σωστή του θέση στη b. a b t x t = επόμενος κόμβος της a x = κόμβος της b που προηγείται του t : ο t πρέπει να τοποθετηθεί στη θέση x->next
Ταξινόμηση Συνδεδεμένης Λίστας Ταξινόμηση με εισαγωγή t = επόμενος κόμβος της a x = κόμβος της 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 = επόμενος κόμβος της a x = κόμβος της 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 81 a b t 512 x u
Διπλά Συνδεδεμένη Λίστα διπλά συνδεδεμένη λίστα typedef struct node *link; struct node {Item item; link next; link previous;}; διπλά συνδεδεμένη κυκλική λίστα
Δομή Εύρεσης-Ένωσης με Λίστες Διατηρούμε ξένα μεταξύ τους σύνολα που είναι υποσύνολα ενός, όπου και Δημιουργεί νέο σύνολο με μόνο στοιχείο το Έστω το σύνολο που περιέχει το και έστω το σύνολο που περιέχει το. Δημιουργεί ένα νέο σύνολο και διαγράφει τα και Επιστρέφει το όνομα του συνόλου που περιέχει το Λειτουργίες Ως «όνομα» ενός συνόλου μπορούμε να ορίσουμε ένα στοιχείο που να αποτελεί τον «αντιπρόσωπο» του συνόλου συνόλου
Δομή Εύρεσης-Ένωσης με Λίστες Έχουμε δει αποδοτικές δομές εύρεσης-ένωσης που αναπαριστούν τα σύνολα με ένα μόνο πίνακα δέντρο ένωσης-εύρεσης πίνακας Εδώ θα σχεδιάσουμε μια δομή εύρεσης-ένωσης με συνδεδεμένες λίστες η οποία θα μας επιτρέπει επιπλέον να βρίσκουμε γρήγορα όλα τα στοιχεία ενός συνόλου
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας d headS bah Π.χ. για το σύνολο με αντιπρόσωπο Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο typedef struct node *link; struct node {Item item; link next; link rep}; headS bdah
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Τώρα τα ορίσματα που δέχονται και οι τιμές που επιστρέφουν οι λειτουργίες και είναι δείκτες σε κόμβους Η λειτουργία επιστρέφει ένα δείκτη σε νέο κόμβο που αποθηκεύει το στοιχείο Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο x k Δημιουργεί νέο κόμβο που αποθηκεύει το στοιχείο k και επιστρέφει δείκτη x στον κόμβο link x = malloc(sizeof *x); x->item = k; x->next = NULL; x->rep = x; Χρόνος
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο Επιστρέφει το δείκτη x->rep Χρόνος bdah x
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p. Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το bdac x h y
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p. Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το bdac p h q
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p. Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το bdac p h qv
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p. Χρόνος όπου ο αριθμός των στοιχείων στo σύνολο που περιέχει το bdac p h qv
Δομή Εύρεσης-Ένωσης με Λίστες Κάθε σύνολο μπορεί να αποθηκευτεί σε μια συνδεδεμένη λίστα με τον αντιπρόσωπο του στην κορυφή της λίστας Για να έχουμε τη δυνατότητα να βρούμε τον αντιπρόσωπο γρήγορα, προσθέτουμε στη δομή node ένα ακόμα πεδίο rep που είναι δείκτης στον κόμβο-αντιπρόσωπο Έστω p=x->rep και q=y->rep. Διατρέχει τη λίστα του q και για κάθε κόμβο v αυτής της λίστας θέτει v->rep = p. Τέλος συνενώνει τις δύο λίστες σε μία λίστα με αρχικό κόμβο το p. Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το αντίστοιχα
Δομή Εύρεσης-Ένωσης με Λίστες Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το αντίστοιχα bdah 4 Τώρα πρέπει να αποθηκεύουμε και τον αριθμό των στοιχείων του κάθε συνόλου, π.χ. σε ξεχωριστό κόμβο-κεφαλή που παίζει το ρόλο του αντιπρόσωπου Άσκηση: Δώστε τις λεπτομέρειες αυτής της δομής, ειδικά το πως υλοποιείται η
Δομή Εύρεσης-Ένωσης με Λίστες Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το αντίστοιχα Απόδειξη Αν ισχύει ο παραπάνω χρόνος για μια ένωση, τότε ενώσεις γίνονται σε χρόνο όπου ο συνολικός αριθμός των στοιχείων
Δομή Εύρεσης-Ένωσης με Λίστες Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το αντίστοιχα Απόδειξη Έστω. Τότε η εκτελείται σε χρόνο και το νέο σύνολο που προκύπτει έχει στοιχεία. Το κόστος επιμερίζεται σε κόστος ανά στοιχείο που αλλάζει δείκτη σε αντιπρόσωπο. Επομένως αν το συμμετέχει στο μικρότερο σύνολο σε ενώσεις τότε το νέο σύνολο που περιέχει το θα έχει στοιχεία. Όμως οπότε. Άρα το συνολικό κόστος ανά στοιχείο είναι. Αφού έχουμε στοιχεία το συνολικό κόστος είναι Αν ισχύει ο παραπάνω χρόνος για μια ένωση, τότε ενώσεις γίνονται σε χρόνο όπου ο συνολικός αριθμός των στοιχείων
Δομή Εύρεσης-Ένωσης με Λίστες Με λίγη περισσότερη προσπάθεια ο χρόνος της ένωσης γίνεται όπου και ο αριθμός των στοιχείων του συνόλου που περιέχει το και το αντίστοιχα Αν ισχύει ο παραπάνω χρόνος για μια ένωση, τότε ενώσεις γίνονται σε χρόνο όπου ο συνολικός αριθμός των στοιχείων Ο παράγοντας στο χρόνο αντιστοιχεί στο κόστος εύρεσης των αντιπροσώπων των συνόλων που ενώνονται Παρατήρηση Με βάση τα παραπάνω καταλήγουμε στο συμπέρασμα ότι οποιαδήποτε ακολουθία από λειτουργίες και λειτουργίες και απαιτεί συνολικό χρόνο
Δομή Εύρεσης-Ένωσης με Λίστες bdah4 Ερώτημα : Πως μπορούμε να βρούμε τον κόμβο που περιέχει ένα στοιχείο ; Αν τα στοιχεία είναι μικροί ακέραιοι (π.χ. ) τότε μπορούμε να αποθηκεύσουμε ένα πίνακα δεικτών όπου η θέση δείχνει στον κόμβο που αντιστοιχεί στο στοιχείο Π.χ.
Δομή Εύρεσης-Ένωσης με Λίστες Ερώτημα : Πως μπορούμε να βρούμε τον κόμβο που περιέχει ένα στοιχείο ; Αν τα στοιχεία είναι μικροί ακέραιοι (π.χ. ) τότε μπορούμε να αποθηκεύσουμε ένα πίνακα δεικτών όπου η θέση δείχνει στον κόμβο που αντιστοιχεί στο στοιχείο Διαφορετικά χρειαζόμαστε μια δομή αναζήτησης (λεξικό), π.χ. δένδρο αναζήτησης ή πίνακας διασποράς. Προσεχώς…
Σύνθετες Δομές Δεδομένων Πίνακες (μήτρες) στη γραμμική άλγεβρα Υλοποίηση στη 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 η κάθε γραμμή του Α
Γράφημα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) πλήθος κορυφών πλήθος ακμών
Γράφημα Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Μερικά είδη γραφημάτων: Κατεύθυνση ακμών - μη κατευθυνόμενα - κατευθυνόμενα Βάρος ακμών - μη σταθμισμένα - σταθμισμένα
Αναπαράσταση Γραφήματος Μήτρα γειτνίασης (adjacency matrix): TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Χρησιμοποιούμε έναν πίνακα Α, όπου συμμετρικός πίνακας Ελέγχουμε αν σε χρόνο Επεξεργαζόμαστε όλες τις ακμές σε χρόνο Χώρος: bits
Αναπαράσταση Γραφήματος Μήτρα γειτνίασης (adjacency matrix): TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Χρησιμοποιούμε έναν πίνακα Α, όπου Ελέγχουμε αν σε χρόνο Επεξεργαζόμαστε όλες τις ακμές σε χρόνο Χώρος: bits
Αναπαράσταση Γραφήματος Λίστες γειτνίασης (adjacency lists): TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Χρησιμοποιούμε έναν πίνακα Α, όπου είναι δείκτης σε λίστα Χώρος: λέξεις Ελέγχουμε αν σε χρόνο Επεξεργαζόμαστε όλες τις ακμές σε χρόνο των κόμβων που γειτονεύουν με τον κόμβο i Κάθε ακμή εμφανίζεται 2 φορές A
Αναπαράσταση Γραφήματος Λίστες γειτνίασης (adjacency lists): TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Χώρος: λέξεις Ελέγχουμε αν σε χρόνο Επεξεργαζόμαστε όλες τις ακμές σε χρόνο Χρησιμοποιούμε έναν πίνακα Α, όπου είναι δείκτης σε λίστα των κόμβων που γειτονεύουν με τον κόμβο i A
Αναπαράσταση Γραφήματος Λίστες γειτνίασης (adjacency lists): TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A #define N 6 typedef 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]); } Διαβάζει μη κατευθυνόμενο γράφημα adj
Τυχαία Γραφήματα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Επιλέγουμε ακμές τυχαία (από κάποια κατανομή) σε γράφημα με κόμβους
Τυχαία Γραφήματα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Επιλέγουμε ακμές τυχαία (από κάποια κατανομή) σε γράφημα με κόμβους
Τυχαία Γραφήματα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A Ομοιόμορφα τυχαία επιλογή κόμβων srand(seed); for(i=0; i<m; i++) { j = (rand() % n) + 1; k = (rand() % n) + 1; addEdge(j,k); } Eπιλέγουμε ομοιόμορφα τυχαία τους δύο κόμβους της κάθε ακμής από τους κόμβους του γραφήματος Κατασκευάζει γράφημα με κόμβους και ακμές αλλά μπορεί να περιέχει βρόχους και πολλαπλές (επαναλαμβανόμενες) ακμές βρόχος διπλή ακμή
Τυχαία Γραφήματα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A 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); Το παρακάτω πρόγραμμα επιλέγει κάθε μια από τις δυνατές ακμές με πιθανότητα Ομοιόμορφη δειγματοληψία Κατασκευάζει γράφημα με κόμβους και αναμενόμενο αριθμό ακμών