ΑΛΓΟΡΙΘΜΟΙ ΜΕ C ΝΙΚΟΛΑΟΣ ΣΑΜΑΡΑΣ Αναπληρωτής Καθηγητής CMOR Lab Computational Methodologies and Operations Research
Quiz-[9] Συν (+) και Πλην (-) Έστω n συνεχόμενοι θετικοί ακέραιοι από το 1 μέχρι το n. Σχεδιάστε έναν αλγόριθμο ο οποίος θα τοποθετεί τους αριθμητικούς τελεστές (+) και (-) έτσι ώστε το αλγεβρικό άθροισμα των n θετικών ακεραίων να είναι ίσο με το 0. Στην περίπτωση που δεν μπορεί να επιτευχθεί το αλγεβρικό άθροισμα να είναι ίσο με 0, να εμφανίζει το μήνυμα δεν υπάρχει λύση. 2
Συνδεδεμένες Λίστες (1) Ομοειδή στοιχεία Αποτελούνται από 2 μέρη: Πληροφορία και Δείκτη. Η πληροφορία μπορεί να είναι ατομική ή ομαδική (εγγραφή). Δυναμική δομή Μπορούμε να προσθαφαιρούμε στοιχεία χωρίς πρόβλημα. Γραμμική δομή Υπάρχει «λογική» διάταξη των στοιχείων, δηλαδή κάθε στοιχείο έχει ένα επόμενο (πλην του τελευταίου) και ένα προηγούμενο (πλην του πρώτου). Αποθήκευση στοιχείων σε διάσπαρτες θέσεις Σειριακή προσπέλαση (ξεκινάμε πάντα από την αρχή και μετακινούμαστε μέσω των δεικτών στον επόμενο κόμβο). Διαγραφή στοιχείου με αλλαγή τιμής ενός δείκτη Πράξεις: α) αναζήτηση αριθμού, β) εισαγωγή αριθμού ώστε να γίνει επόμενος κάποιου άλλου, γ) διαγραφή επόμενου, δ) και άλλες πολλές. 3
Συνδεδεμένες Λίστες (2) Δυο ειδών συνδεμένες λίστες : 1) απλά συνδεμένες λίστες (singly linked lists): πράξεις μόνο για επόμενο στοιχείο 2) διπλά συνδεμένες λίστες (double linked lists): πράξεις για επόμενο και προηγούμενο στοιχείο 4
Συνδεδεμένες Λίστες (3) Συνδεδεμένη λίστα με ακεραίους 1 2 5 2 3 6 9 8 first Κάθε κόμβος έχει έναν δείκτη next στον επόμενο κόμβο last Διπλά συνδεδεμένη λίστα με εγγραφές 1 Mary 25 2 John 21 3 Kate 30 4 Bill 44 5 Jack 31 6 Jason 50 first/last Κάθε κόμβος έχει έναν δείκτη next στον επόμενο κόμβο και έναν δείκτη previous στον προηγούμενο κόμβο last/first 5
Απλά Συνδεδεμένες Λίστες (1) Για τον καθορισμό του επόμενου χρησιμοποιούμε διάνυσμα next : Αν L(k) επόμενο του L(i), next(i)= k next(i) = 0 i τελευταίο στοιχείο της λίστας L. first = η θέση του πρώτου στοιχείου i L next first 1 2 3 4 5 6 7... n 5 8 2 3... 0 6 2 4... 6
Απλά Συνδεδεμένες Λίστες (2) Πράξη 1. Αναζήτηση αριθμού x Αλγόριθμος: findsl Δεδομένα: x, L, next, first Αποτελέσματα: found, index 1 2 3 4 5 6 7 8 9 found 0 index first όσο found = 0 και next(index) 0 αν L(index) = x found 1 αλλιώς index next(index) αν next(index) = 0 και L(index) = x found 1 7
Απλά Συνδεδεμένες Λίστες (3) Πράξη 2. Εισαγωγή y ώστε να γίνει επόμενο του L(k) Ο αριθμός y αποθηκεύεται σε κενές θέσεις Πρέπει να γνωρίζουμε, που υπάρχουν κενές θέσεις Αν οργανώσουμε τις κενές θέσεις σαν στοίβα ή ουρά θα χρειαστούμε επί πλέον χώρο μνήμης. Καλύτερα, να τις οργανώσουμε σαν συνδεμένη λίστα (με εισαγωγή και διαγραφή μόνο στην πρώτη θέση). 8
Απλά Συνδεδεμένες Λίστες (4) Χρησιμοποιούμε τη μεταβλητή free, η οποία δείχνει το δείκτη της πρώτης ελεύθερης θέσης (free = 0 δεν υπάρχουν κενές θέσεις) Σε μια κενή λίστα ισχύουν: first = 0, free = 1, next(i) = i + 1, για i = 1, 2,..., n-1, next(n) =0 9
Απλά Συνδεδεμένες Λίστες (5) Παράδειγμα οργάνωσης κενών θέσεων σε μορφή λίστας first k free i 1 2 3 4 5 6 7 8 L 5 8 2 3 next 8 0 6 2 1 4 0 7 Για εισαγωγή του y μετά το L(k) τίθεται L(free) = y και αλλάζουν τιμές μερικοί δείκτες. 10
Απλά Συνδεδεμένες Λίστες (6) Παράδειγμα: Εισαγωγή y = 9 μετά τον L(4) = 2 ( k = 4 ). first k free i 1 2 3 4 5 6 7 8 L 5 8 2 3 free first next 8 0 6 2 1 4 0 7 i 1 2 3 4 5 6 7 8 L 5 8 2 9 3 next 8 0 6 5 2 4 0 7 11
Απλά Συνδεδεμένες Λίστες (7) Αλγόριθμος: insertsl Δεδομένα: y, k, L, next, first Αποτελέσματα: done, L, next, free 1 2 3 4 5 6 7 8 done 0 αν free 0 done 1 L(free) y a free free next(free) next(a) next(k) next(k) a 12
Απλά Συνδεδεμένες Λίστες (8) Παράδειγμα: Εισαγωγή y = 9 μετά τον L(4) = 2 ( k = 4 ). free first k free i 1 2 3 4 5 6 7 8 L 5 8 2 9 3 next 8 0 6 25 12 4 0 7 4. L(free) y : L(5) 9 5. a free : a 5 6. free next(free) : free next(5) : free 1 7. next(a) next(k) : next(5) next(4) : next(5) 2 8. next(k) a : next(4) 5 13
Απλά Συνδεδεμένες Λίστες (9) Πράξη 3 : Διαγραφή του στοιχείου x της θέσης k. Διακρίνουμε τρεις περιπτώσεις : 1) το διαγραφόμενο στοιχείο είναι πρώτο (k = first), 2) το διαγραφόμενο στοιχείο είναι τελευταίο (next(k) = 0) 3) το διαγραφόμενο στοιχείο είναι ένα ενδιάμεσο στοιχείο Στις περιπτώσεις (2) και (3) χρειαζόμαστε τη θέση prev του προηγούμενου στοιχείου του x = L(k) 14
Απλά Συνδεδεμένες Λίστες (10) (1). Διαγραφή του πρώτου στοιχείου. free first i 1 2 3 4 5 6 7 8 L 5 8 2 9 3 next 8 0 6 5 2 4 0 7 Ποια θα είναι τα νέα free, first, L και next μετά τη διαγραφή? 15
Απλά Συνδεδεμένες Λίστες (11) (1). Διαγραφή του πρώτου στοιχείου. free first i 1 2 3 4 5 6 7 8 L 5 2 9 3 next 8 0 1 5 2 4 0 7 16
Απλά Συνδεδεμένες Λίστες (12) (2). Διαγραφή του τελευταίου στοιχείου. free first prev i 1 2 3 4 5 6 7 8 L 5 8 2 9 3 next 8 0 6 5 2 4 0 7 Ποια θα είναι τα νέα free, first, L και next μετά τη διαγραφή? 17
Απλά Συνδεδεμένες Λίστες (13) (2). Διαγραφή του τελευταίου στοιχείου. free first i 1 2 3 4 5 6 7 8 L 8 2 9 3 next 8 1 6 5 0 4 0 7 18
Απλά Συνδεδεμένες Λίστες (14) (3). Διαγραφή του στοιχείου x=9, k=5. free first prev i 1 2 3 4 5 6 7 8 L 5 8 2 9 3 next 8 0 6 5 2 4 0 7 Ποια θα είναι τα νέα free, first, L και next μετά τη διαγραφή? 19
Απλά Συνδεδεμένες Λίστες (15) (3). Διαγραφή του στοιχείου x=9, k=5. first free i 1 2 3 4 5 6 7 8 L 5 8 2 3 next 8 0 6 2 1 4 0 7 20
Απλά Συνδεδεμένες Λίστες (16) Είδη αλλαγών κατά τη διαγραφή στοιχείου σε απλά συνδεδεμένες λίστες Στην περίπτωση (1) αλλάζουν τιμές οι μεταβλητές first, next(k) και free ενώ Στις περιπτώσεις (2) και (3) αλλάζουν τιμές οι μεταβλητές next(prev), next(k) και free. 21
Απλά Συνδεδεμένες Λίστες (17) Αλγόριθμος: delsl Δεδομένα: prev, k, next, free, first, L Αποτελέσματα: next, first, free, L 1 2 3 4 5 6 7 8 αν k = first % περίπτωση 1) first next(first) next(k) free free k αλλιώς % περιπτώσεις 2) και 3) next(prev) next(k) next(k) free free k 22
Δέντρα (1) Δέντρο: είναι ένα συνεκτικό γράφημα χωρίς κύκλους. Iδιότητες: α) Κάθε δύο κόμβοι συνδέονται με ακριβώς ένα δρόμο. β) Ένα δέντρο έχει τουλάχιστον δύο φύλλα γ) Ένα δέντρο με n κόμβους έχει n-1 τόξα (ακμές) 23
Δέντρα (2) Ορολογία Διαδρομή (path) από ένα κόμβο Ν x σε ένα άλλο κόμβο Ν y είναι μια ακολουθία κόμβων όπου πρώτος είναι ο Ν x, τελευταίος ο Ν y και κάθε άλλος κόμβος είναι παιδί του προηγουμένου. Μήκος (length) μιας διαδρομής είναι ο αριθμός των ακμών που περιλαμβάνονται σ αυτήν. Επίπεδο (level) ή βάθος (depth) ενός κόμβου είναι το μήκος της μοναδικής διαδρομής από τη ρίζα στον κόμβο αυτό. Ύψος (height) ενός δένδρου είναι το μέγιστο βάθος των (τερματικών) κόμβων του. Βαθμός (degree) ενός κόμβου είναι ο αριθμός των παιδιών του. Βαθμός ενός δένδρου είναι ο μέγιστος των βαθμών των κόμβων του. 24
Δέντρα (3) 5 Ένα ριζωμένο δέντρο 1 2 3 4 6 8 7 9 Επίπεδο 0, ρίζα (Βάθος{1}=0) Επίπεδο 1 (Βάθος{2,3,4}=1) Επίπεδο 2 (Βάθος{5,6,7}=2) Επίπεδο 3 (Βάθος{8,9}=3) } (Βάθος{Τ}=3) 25
Δέντρα (4) 1 Ύψος(1)=3-0=3=Βάθος{Τ} 2 3 4 Βάθος{3}=1 5 6 7 }Ύψος(3)= =Βάθος{Τ}-Βάθος{3} = 3-1 = 2 8 9 Βάθος{Τ}=3 Ύψος(9)=3-3=0 26