Ενότητα 2 Στοίβες Ουρές - Λίστες

Σχετικά έγγραφα
Ενότητα 2 Στοίβες Ουρές - Λίστες

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 2η: Στοίβες Ουρές - Λίστες Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Ενότητα 2 Στοίβες Ουρές - Λίστες. ΗΥ240 - Παναγιώτα Φατούρου 1

Στοίβες Ουρές - Λίστες

IsEmptyList(L): επιστρέφει true αν L = < >, false

ΕΝΟΤΗΤΑ 3 ΓΡΑΜΜΙΚΕΣ ΛΙΣΤΕΣ

Βασικές Δομές Δεδομένων

Βασικές οµές εδοµένων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

Υλοποίηση Λειτουργιών Στοίβας Απλά(1/2)

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 4η: Σύνολα - Λεξικά Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

ιαφάνειες παρουσίασης #11

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

Ενότητα 7 Ουρές Προτεραιότητας

Βασικές Έννοιες Δοµών Δεδοµένων

Δομές Δεδομένων (Data Structures)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 7η: Ουρές Προτεραιότητας Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Δομές δεδομένων. Ενότητα 8: Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find) Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Δομές Δεδομένων & Αλγόριθμοι

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Insert(K,I,S) Delete(K,S)

Δομές Δεδομένων (Data Structures)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Τηλ , Fax: , URL:

Συλλογές, Στοίβες και Ουρές

Ενότητα 7 Ουρές Προτεραιότητας

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

Δομές Δεδομένων & Αλγόριθμοι

Τηλ , Fax: , URL:

2.2.5 ΑΝΑΠΑΡΑΣΤΑΣΗ ΑΛΓΟΡΙΘΜΟΥ

ΕΝΟΤΗΤΑ 5 ΥΛΟΠΟΙΗΣΗ ΛΕΞΙΚΩΝ ΜΕ ΙΣΟΖΥΓΙΣΜΕΝΑ ΔΕΝΔΡΑ

Δομές δεδομένων. Ενότητα 5η: Υλοποίηση Λεξικών με Ισοζυγισμένα Δένδρα Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΠΛΗ111. Ανοιξη Μάθηµα 5 ο. Ουρά. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Στοίβες με Δυναμική Δέσμευση Μνήμης

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

ΠΛΗ111. Ανοιξη Μάθηµα 4 ο. Στοίβα. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Ισορροπημένα Δένδρα. για κάθε λειτουργία; Ισορροπημένο δένδρο : Διατηρεί ύψος κάθε εισαγωγή ή διαγραφή

υναµικές οµές εδοµένων

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Οι δομές δεδομένων στοίβα και ουρά

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Οντοκεντρικός Προγραμματισμός

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 10η: Γράφοι Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον υποδειγματική διδασκαλία Κεφ. 3 Δομές Δεδομένων & αλγόριθμοι

Τηλ , Fax: , URL:


Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

Φροντιστήριο 4 Σκελετοί Λύσεων

ΚΕΦΑΛΑΙΟ 3 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Τηλ , Fax: , URL:

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ιδιοκτησία Αντικειµένου

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο Κάθε δομή μπορεί να χρησιμοποιηθεί σε οποιοδήποτε πρόβλημα ή εφαρμογή

Φροντιστήριο 4 Σκελετοί Λύσεων

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Δομές Δεδομένων και Αλγόριθμοι

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Κεφάλαιο 10 Ψηφιακά Λεξικά

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ. 4 η ενότητα: Δομές Δεδομένων. Τμήμα. Τεχνολόγων Περιβάλλοντος. ΤΕΙ Ιονίων Νήσων. Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

ιαφάνειες παρουσίασης #5 (β)

Transcript:

Ενότητα 2 Στοίβες Ουρές - Λίστες ΗΥ240 - Παναγιώτα Φατούρου 1 Λίστες Γραµµική λίστα (linear list) είναι ένα σύνολο από έστω n 0 στοιχεία ή κόµβους, e 1,..., e n, τα οποία είναι διατεταγµένα µε γραµµική σειρά. Το e 1 είναι το πρώτο στοιχείο της λίστας και το e n είναι το τελευταίο στοιχείο της λίστας. Το στοιχείο e k προηγείται του στοιχείου e k+1 και έπεται του στοιχείου e k-1, 1 < k < n. L : µήκος λίστας ( L = n) <>: κενή λίστα Λειτουργίες που συνήθως υποστηρίζονται από λίστες Access(L,j): Επιστρέφει το j-οστό στοιχείο της λίστας ή ένα µήνυµα λάθους αν j είναι > L. Length(L): Επιστρέφει L, το µήκος της λίστας. Concat(L 1,L 2 ): Επιστρέφει µια λίστα που είναι το αποτέλεσµα της συνένωσης των δύο λιστών L 1 και L 2 σε µία. MakeEmptyList(): επιστρέφει <>, την κενή λίστα. IsEmptyList(L): επιστρέφει true αν L == <>, false διαφορετικά. ΗΥ240 - Παναγιώτα Φατούρου 2 1

Τρόποι Υλοποίησης Λιστών Στατικές Λίστες Υλοποίηση µε πίνακες Όλα τα στοιχεία της λίστας αποθηκεύονται σε πίνακα. Συνδεδεµένες Λίστες Χρήση δεικτών 228 224 232 222 000 P Σχήµα 1.4: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 ΗΥ240 - Παναγιώτα Φατούρου 3 Τρόποι Υλοποίησης Λιστών Θετικά δυναµικών έναντι στατικών λιστών J Εισαγωγή/διαγραφή νέων στοιχείων γίνεται εύκολα J Ο συνολικός αριθµός στοιχείων δεν χρειάζεται να είναι γνωστός εξ αρχής Αρνητικά δυναµικών έναντι στατικών λιστών L Απαιτούν περισσότερη µνήµη (λόγω των δεικτών). L Ποια είναι η πολυπλοκότητα χρόνου για την ανάκτηση του j-οστού στοιχείου στη λίστα; ΗΥ240 - Παναγιώτα Φατούρου 4 2

Στοίβες κορυφαίο Αφηρηµένος τύπος δεδοµένων Στοίβα (Stack) Μια στοίβα είναι µια λίστα που υποστηρίζει εισαγωγή και διαγραφή στοιχείων µόνο στο ένα της άκρο. Το στοιχείο που αφαιρείται είναι πάντα αυτό που έχει εισαχθεί πιο πρόσφατα. Λειτουργίες Top(S): επιστρέφει το κορυφαίο στοιχείο της S (δηλαδή αυτό που έχει εισαχθεί τελευταίο) Pop(S): διαγραφή και επιστροφή του κορυφαίου στοιχείου της S Push(x,S): εισαγωγή του στοιχείου x στην κορυφή της στοίβας MakeEmptyStack(): επιστρέφει την <>. IsEmptyStack(S): επιστρέφει true αν S = 0 και false διαφορετικά. 5 15 2 42 Η µέθοδος επεξεργασίας των δεδοµένων της στοίβας λέγεται «Εξαγωγή κατά ανάστροφη σειρά εισαγωγής» (Last In First Out, LIFO). e 4 e 3 e 2 e 1 ΗΥ240 - Παναγιώτα Φατούρου 5 1 5 15 2 42 15 2 42 κορυφαίο Μετά την εισαγωγή στοιχείου (Push(1)) µε τιµή 1 κορυφαίο Μετά την εκτέλεση της λειτουργίας της διαγραφής (Pop()) Στατικές Στοίβες Υλοποίηση µε Πίνακα Μια στατική στοίβα υλοποιείται µε τη χρήση ενός µονοδιάστατου πίνακα Α και ενός ακεραίου Length που υποδηλώνει το τρέχον µέγεθος της στοίβας. Ο πίνακας έχει ένα προκαθορισµένο πλήθος θέσεων N. Μια στοίβα µε n N στοιχεία καταλαµβάνει τα στοιχεία Α[0],, Α[n-1] του πίνακα. q Το A[n-1] είναι το κορυφαίο (ή τελευταίο) στοιχείο της στοίβας q Το A[0] είναι το βαθύτερο (ή πρώτο) στοιχείο Έστω Type o τύπος των στοιχείων της στοίβας. Έστω S ένας δείκτης σε ένα struct που έχει δύο πεδία, τον πίνακα Α και τον ακέραιο Length και αναπαριστά µια στοίβα. q Αν S->Length == 0, η στοίβα είναι άδεια. q Αν S->Length == N, η στοίβα είναι γεµάτη. 512 n S Length A[0] A[n-1] A[N-1] ΗΥ240 - Παναγιώτα Φατούρου 6 3

Υλοποίηση Λειτουργιών Στοίβας Pointer MakeEmptyStack(void) pointer S; S = newcell(stack); S->Length = 0; return S; Χρονική Πολυπλοκότητα; Θ(1) boolean IsEmptyStack(pointer S) if (S->Length == 0) return 1; else return 0; Χρονική Πολυπλοκότητα; Θ(1) 512 n A[N] S Length A[0] A[n-1] A[N-1] Type Top(pointer S) if (IsEmptyStack(S)) then error; else (return((s->α)[s->length 1])); Χρονική Πολυπλοκότητα; Θ(1) Συνολικός Απαιτούµενος Χώρος Μνήµης; Ανεξάρτητα από τον αριθµό των στοιχείων που έχουν εισαχθεί στη στοίβα: Ν ΗΥ240 - Παναγιώτα Φατούρου 7 Υλοποίηση Λειτουργιών Στοίβας Type Pop(Pointer S) if (IsEmptyStack(S)) then error else { x = Top(S); S->Length = S->Length 1; return x; Χρονική Πολυπλοκότητα; Θ(1) A[N-1] A[4] A[3] A[2] A[1] A[0] top Length = 5 Length = 4 void Push(Pointer S,Type x) if (S->Length == N) then error else { S->Length = S->Length + 1; (S->A)[S->Length-1] = x; Χρονική Πολυπλοκότητα; Θ(1) A[3] top A[2] A[1] A[0] Length = 4 Length = 5 ΗΥ240 - Παναγιώτα Φατούρου 8 4

Πολλαπλή Στατική Στοίβα Περισσότερες από µια στοίβες που υλοποιούνται χρησιµοποιώντας έναν πίνακα. Παράδειγµα 1: Δύο Στοίβες Έστω Α[0Ν-1] ο πίνακας που χρησιµοποιείται για την αποθήκευση των στοιβών. Η 1 η στοίβα ξεκινάει από τη θέση Α[0] και αναπτύσσεται προς τα δεξιά, ενώ η 2 η ξεκινάει από τη θέση Α[Ν-1] και αναπτύσσεται προς τα αριστερά. κορυφαίο στοιχείο στοίβας 1 κορυφαίο στοιχείο στοίβας 2 Παράδειγµα 2: k Στοίβες Ο πίνακας χωρίζεται σε k ίσα τµήµατα (στο παρακάτω σχήµα k = 4). ΗΥ240 - Παναγιώτα Φατούρου 9 Στοίβα ως Συνδεδεµένη Λίστα pointer MakeEmptyStack() return NULL; Αρχικά S 000 (NULL) boolean IsEmptyStack(pointer S) if (S == NULL) return TRUE; else return FALSE; Type Top(pointer S) if IsEmptyStack(S) then error; else return S->data; F Μετά την εισαγωγή των D,E,F,A (µε αυτή τη σειρά) στη στοίβα 228 S A F E D Χρονική Πολυπλοκότητα κάθε µιας από τις παραπάνω λειτουργίες; Θ(1) E 224 232 222 000 S ΗΥ240 - Παναγιώτα Φατούρου 10 5

222 D 223 000 224 F 225 232 227 228 A 229 224 230 231 232 E 233 222 234 412 228 S 413 414 415 416 417 418 419 420 423 x 228 228 x S P Χώρος στη µνήµη για τις µεταβλητές της Push Εισαγωγή σε Στοίβα x P 228 pointer Push(info x, pointer S) pointer P; /* temporary pointer */ P = NewCell(NODE); /* malloc() */ P->data = x; P->next = S; S = P; return S; Χρονική Πολυπλοκότητα; Θ(1) ΗΥ240 - Παναγιώτα Φατούρου 11 222 D 223 000 224 F 225 232 227 228 A 229 224 230 231 232 E 233 222 234 412 228 S 413 414 415 416 417 418 419 420 423 224 228 A S x Χώρος στη µνήµη για τις µεταβλητές της Pop Διαγραφή από Στοίβα <pointer, info> Pop(pointer S) info x; if (IsEmptyStack(S)) then error; else x = Top(S); S = S->next; return <S,x>; Χρονική Πολυπλοκότητα; Θ(1) 224 Μνήµη; δεδοµένα & (n+1) δείκτες (αν η στοίβα έχει n στοιχεία) ΗΥ240 - Παναγιώτα Φατούρου 12 6

Ουρά Αφηρηµένος Τύπος Δεδοµένων Ουρά (Queue) Λίστα που µπορεί να τροποποιείται µόνο µε την εισαγωγή στοιχείων στο ένα άκρο της και τη διαγραφή στοιχείων από το άλλο. Το στοιχείο που αφαιρείται είναι πάντα αυτό που έχει παραµείνει στην ουρά για το µεγαλύτερο χρονικό διάστηµα. Λειτουργίες Enqueue(x,Q): Εισαγωγή στοιχείου µε τιµή x στο τέλος (back) της ουράς Q Dequeue(Q): Διαγραφή του πρώτου στοιχείου (front) της Q και επιστροφή της τιµής του Front(Q): επιστρέφει το πρώτο στοιχείο της Q. MakeEmptyQueue(): επιστρέφει <>, την κενή ουρά. IsEmptyQueue(Q): επιστρέφει TRUE αν Q == <> και FALSE διαφορετικά. Η µέθοδος επεξεργασίας των δεδοµένων ουράς λέγεται «Εξαγωγή κατά σειρά εισαγωγής» (First In First Out, FIFO). Ουρά Q 5 15 1 9 πρώτο τελευταίο Μετά την εκτέλεση της λειτουργίας Enqueue(Q,6) 5 15 1 9 6 πρώτο 15 1 9 πρώτο τελευταίο Μετά την εκτέλεση της λειτουργίας Dequeue(Q)) τελευταίο ΗΥ240 - Παναγιώτα Φατούρου 13 Στατικές Ουρές Υλοποίηση µε Πίνακα Η στατική ουρά υλοποιείται ως ένα struct (στη C) µε πεδία έναν πίνακα Α µε προκαθορισµένο πλήθος θέσεων N και δύο ακεραίους: q Length που υποδηλώνει το τρέχον µέγεθος της ουράς q Front που υποδηλώνει τη θέση του πρώτου στοιχείου της ουράς 512 Q στον πίνακα. Έστω Q ένας δείκτης στο struct µιας ουράς και έστω Type o τύπος των στοιχείων της ουράς. q Αν Q->Length == 0, η ουρά είναι άδεια. q Αν Q->Length == N, η ουρά είναι γεµάτη. q e 1,, e n : στοιχεία ουράς q A[Front mod N], A[(Front + 1) mod N],, A[(Front + n - 1) mod N]: θέσεις στις οποίες είναι αποθηκευµένα τα e 1,, e n. N-2 n e 3 Front Length A[0] = A[(Front + 2) % N] e n A[n-3]=A[(Front +n-1) % N] e 1 e 2 e 3 0 e 4 1 e 5 2 e 6 3 4 5 6 7 e 1 8 e 2 9 A[N-2] = A[Front % N] A[N-1] = A[(Front + 1) % N] ΗΥ240 - Παναγιώτα Φατούρου 14 7

Υλοποίηση Λειτουργιών Ουράς pointer MakeEmptyQueue(void) pointer Q; /* temporary pointer */ Q = NewCell(Queue); /* malloc() */ Q->Front = 0; Q->Length = 0; return Q; Χρονική Πολυπλοκότητα; boolean IsEmptyQueue(pointer Q) if (Q->Length == 0) return 1; else return 0; Χρονική Πολυπλοκότητα; Θ(1) 512 0 0 Q Front Length A[0] A[Ν-1] Type Front(pointer Q) if (IsEmptyQueue()) then error; else (return((q->α)[q->front])); Χρονική Πολυπλοκότητα; Θ(1) Συνολικός Απαιτούµενος Χώρος Μνήµης; Ανεξάρτητα από τον αριθµό των στοιχείων που έχουν εισαχθεί στην ουρά: Ν ΗΥ240 - Παναγιώτα Φατούρου 15 Υλοποίηση Λειτουργιών Ουράς Type Dequeue(pointer Q) if (IsEmptyQueue(Q)) then error else { x = Front(Q); Q->Front = (Q->Front+1) mod N; Q->Length = Q->Length 1; return x; Χρονική Πολυπλοκότητα; Θ(1) void Enqueue(pointer Q, Type x) if (Q->Length == N) then error else { Q->Length = Q->Length+1; (Q->A)[(Q->Front + Q->Length 1)% N] = x; Χρονική Πολυπλοκότητα; Θ(1) 512 N-2 n e 3 e n e 1 e 2 Enqueue() A[N-2] ΗΥ240 - Παναγιώτα Φατούρου e 2 A[N-1] 16 Q Front Length A[0] A[n-3] A[N-2] A[N-1] 512 Dequeue() 512 N-2 n+1 e 3 e n e n+1 e 1 N-1 n-1 e 3 e n e 1 e 2 Q Front Length A[0] A[n-3] A[n-2] Q Front Length A[0] A[n-3] A[N-2] A[N-1] 8

Ουρά ως Συνδεδεµένη Λίστα Node: struct µε πεδία: q data: πληροφορία αποθηκευµένη στο στοιχείο q next: δείκτης στο επόµενο στοιχείο Queue: struct µε πεδία δύο δείκτες: q Front: δείκτης στο πρώτο στοιχείο q Back: δείκτης στο τελευταίο στοιχείο pointer MakeEmptyQueue(void) pointer Q; /* temporary pointer */ Q = NewCell(Queue); /* malloc */ Q->Front = Q->Back = NULL; return Q; boolean IsEmptyQueue(pointer Q) if (Q->Front == NULL) then return TRUE; else return FALSE; Type Front(pointer Q) if (IsEmptyQueue(Q)) then error; else return ((Q->Front)->data); F Μετά την εισαγωγή των Α,F,E,D (µε αυτή τη σειρά) στην ουρά E 224 232 222 000 Q 228 222 Q NULL ΗΥ240 - Παναγιώτα Φατούρου 17 A NULL F Front Back 228 222 Front Back E 412 Q D Χρονική Πολυπλοκότητα κάθε µιας από αυτές τις λειτουργίες; Θ(1) 1η Περίπτωση Q Εισαγωγή σε Ουρά 2η Περίπτωση 228 Front 412 Q 222 Back Front NULL Back NULL 416 P x 000 A F E D 224 232 222 000 x 000 416 P void Enqueue(Type x, pointer Q) pointer P; /* temporary pointer */ P = NewCell(Node); P->data = x; P->next = NULL; if (IsEmptyQueue(Q)) then Q->Front = P; else Q->Back->next = P; Q->Back = P; Χρονική Πολυπλοκότητα; Θ(1) ΗΥ240 - Παναγιώτα Φατούρου 18 9

1η Περίπτωση Q Διαγραφή από Ουρά 2η Περίπτωση 228 Front 412 Q 222 Back Front Back 000 D 000 A F E D 224 232 222 000 Type Dequeue(pointer Q) if (IsEmptyQueue(Q)) then error; else { x = (Q->Front)->data; Q->Front = (Q->Front)->next; if (Q->Front == NULL) then Q->Back = NULL; return x; Χρονική Πολυπλοκότητα; Θ(1) Μνήµη; δεδοµένα & (n+3) δείκτες (αν η ουρά έχει n στοιχεία) ΗΥ240 - Παναγιώτα Φατούρου 19 Συνδεδεµένες Λίστες Έστω ότι κάθε στοιχείο της λίστας (struct node) έχει δύο πεδία, έναν ακέραιο data και το δείκτη next. Ένας δείκτης L δείχνει στο πρώτο στοιχείο της λίστας. L x 228 416 P Εισαγωγή σε Λίστα void ListInsert(int x) pointer p; p = newcell(node); p->data = x; p->next = L; L = p; Αναζήτηση σε Λίστα boolean ListSearch(Type x) { pointer q = L; while (q!= NULL && q->data!= x) q = q->next; return (q!= NULL); Άσκηση: Υλοποιείστε τη Delete(). ΗΥ240 - Παναγιώτα Φατούρου 20 10

Κόµβος Φρουρός Προς επίλυση Πρόβληµα Αναζήτηση ενός στοιχείου x στη λίστα. Λύση µε κόµβο φρουρό q Έχουµε εξ αρχής τοποθετήσει ένα κόµβο στη λίστα που λέγεται κόµβος φρουρός. Ο κόµβος αυτός είναι πάντα ο τελευταίος στη λίστα και χρησιµοποιείται µόνο για τη διαχείριση της λίστας (δηλαδή δεν θεωρείται στοιχείο της λίστας). q Ένας δείκτης δείχνει µόνιµα σε αυτόν τον κόµβο. q Κατά την αναζήτηση, η τιµή που αναζητείται αρχικά αποθηκεύεται στον κόµβο αυτό (π.χ. στο πεδίο data του struct του). q Στη συνέχεια, εκτελείται διάσχιση της λίστας µε τον γνωστό αλγόριθµο αναζήτησης για τo στοιχείο αυτό. q Το στοιχείο θα βρεθεί σίγουρα, είτε νωρίτερα σε κάποια θέση άλλη από τον κόµβο φρουρό ή στον κόµβο φρουρό. q Στην 1 η περίπτωση, η αναζήτηση είναι επιτυχηµένη. q Στην 2 η περίπτωση, όχι. Τι κερδίζουµε µε τη χρήση κόµβου φρουρού; ΗΥ240 - Παναγιώτα Φατούρου 21 L boolean ListSearch(Type x) { pointer q = L; while (q!= NULL && q->data!= x) q = q->next; return (q == NULL); G Εισαγωγή Στοιχείου σε Tαξινοµηµένη Λίστα Κάθε κόµβος της λίστας περιέχει π.χ. έναν ακέραιο data και ένα δείκτη next στον επόµενο κόµβο. Έστω L ένας δείκτης στο πρώτο στοιχείο της λίστας. Η λίστα είναι ταξινοµηµένη. Πρόβληµα προς επίλυση Εισαγωγή νέου στοιχείου στη λίστα, έτσι ώστε η λίστα να εξακολουθήσει να είναι ταξινοµηµένη. Έστω x ο προς εισαγωγή ακέραιος. Πρόβληµα µε την εισαγωγή στοιχείου σε ταξινοµηµένη λίστα: Είναι δυνατή η εισαγωγή ενός στοιχείου µόνο ως επόµενου κόµβου κάποιου δεδοµένου κόµβου και όχι ως προηγούµενου. L B C F pointer q = L; while (q!= NULL && q->data < x) q = q->next; return (q == NULL); ΗΥ240 - Παναγιώτα Φατούρου 22 11

Εισαγωγή Στοιχείου σε Ταξινοµηµένη Λίστα void LLInsert(Type x, pointer L) pointer C, ptr; /* temporary pointers */ q = L; pq = NULL; while (q!= NULL) and (q->data < x) { pq = q; q = q->next; if (q!= NULL) and (q->data == x) then return; /* x is already in list */ p = NewCell(Node); /* malloc */ p->data = x; p->next = q; if (pq == NULL) then L = p; else pq->next = p; L pq E p B C F q ΗΥ240 - Παναγιώτα Φατούρου 23 Διάσχιση Λίστας Εκτέλεση επίσκεψης σε ένα ή σε κάποια στοιχεία µιας λίστας που έχουν µια ιδιότητα. Θεωρούµε λίστα που περιέχει αλφαριθµητικά (strings) και είναι λεξικογραφικά ταξινοµηµένη. Πρόβληµα 1 Δεδοµένου ενός αλφαριθµητικού w, ζητείται το τελευταίο αλφαριθµητικό στη λίστα που προηγείται αλφαβητικά του w και τελειώνει µε το ίδιο γράµµα όπως το w. Παράδειγµα w = crabapple L = <canary, cat, chickadee, coelacanth, collie, corn, cup>. H απάντηση θα πρέπει να είναι collie. ΗΥ240 - Παναγιώτα Φατούρου 24 12

Πιθανοί Αλγόριθµοι Επίλυσης Προβλήµατος 1 Αλγόριθµος 1 Διασχίζουµε τη λίστα µέχρι να βρούµε την πρώτη λέξη που είναι αλφαβητικά µεγαλύτερη από την crabapple (στο παράδειγµα την cup), κρατώντας σε µια στοίβα δείκτες στους κόµβους που διασχίσαµε. Εξάγουµε έναν-έναν τους δείκτες από τη στοίβα και εξετάζουµε τα structs στα οποία δείχνουν (µε αυτό τον τρόπο πραγµατοποιούµε αντίστροφη διάσχιση της λίστας) µέχρι να βρούµε την πρώτη λέξη που τελειώνει σε e. 232 282 252 364 244 458 488 232 282 252 364 244 458 488 top Είναι αυτή η πιο αποδοτική λύση; Αλγόριθµος 2 Διασχίζουµε τη λίστα ξεκινώντας από τον 1ο κόµβο της διατηρώντας ένα βοηθητικό δείκτη στο τελευταίο στοιχείο που διασχίσαµε και είχε την επιθυµητή ιδιότητα. Πως θα συγκρίνατε την πολυπλοκότητα των δύο αλγορίθµων? ΗΥ240 - Παναγιώτα Φατούρου 25 Διασχίσεις Zig-Zag Έστω ότι κάθε κόµβος της λίστας έχει τα εξής πεδία: q word: αλφαριθµητικό q num: ακέραιος q next: δείκτης στον επόµενο κόµβο Πρόβληµα 2 Δίδεται ένα αλφαριθµητικό w. Έστω ότι το w υπάρχει στη λίστα σε κάποιον κόµβο p του οποίου το πεδίο num έχει τιµή n. Αναζητείται η τιµή του πεδίου word του κόµβου που προηγείται του p κατά n θέσεις στη λίστα. Παρουσιάστε αλγόριθµο που να επιλύει το πρόβληµα. ΗΥ240 - Παναγιώτα Φατούρου 26 13

Διπλά Συνδεδεµένες Λίστες Σχήµα 3.5: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 Κάθε κόµβος µιας διπλά συνδεδεµένης λίστας αποθηκεύει δείκτες και προς το επόµενο και προς το προηγούµενο στοιχείο του κόµβου. Διασχίσεις Zig-Zag είναι εύκολα υλοποιήσιµες! ΗΥ240 - Παναγιώτα Φατούρου 27 Διπλά Συνδεδεµένες Λίστες Εισαγωγή κόµβου στον οποίο δείχνει ο δείκτης P µετά τον κόµβο στον οποίο δείχνει ο δείκτης Q void DoublyLinkedInsert(pointer P,Q) /* insert node pointed to by P just after node pointed to by Q */ P > Pr ev Q P > Next Q > Next Q > Next P Q > Next > Pr ev P Διαγραφή κόµβου P από τη λίστα void DoublyLinkedDelete(pointer P) /* delete node P from its doubly linked list */ P > Pr ev > Next P > Next P > Next > Pr ev P > Pr ev Α Β D E Σχήµα 3.5: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 ΗΥ240 - Παναγιώτα Φατούρου 28 14

Τεχνικές Επιµεριστικής Ανάλυσης Η επιµεριστική ανάλυση µελετά τη συµπεριφορά χειρότερης περίπτωσης ενός αλγορίθµου ή δοµής καθώς υποβάλλεται σε µια ακολουθία από n λειτουργίες. Μέθοδοι Επιµεριστικής Ανάλυσης Η αθροιστική µέθοδος Η λογιστική µέθοδος Η µέθοδος του δυναµικού (δεν θα διδαχθεί σε αυτό το µάθηµα) ΗΥ240 - Παναγιώτα Φατούρου 29 Μέθοδοι Επιµεριστικής Ανάλυσης Aθροιστική Μέθοδος Καθορισµός ενός πάνω φράγµατος T(n) στο συνολικό κόστος µιας ακολουθίας n λειτουργιών. Το επιµεριστικό κόστος κάθε λειτουργίας είναι T(n)/n. Λογιστική Μέθοδος Καθορισµός ενός επιµεριστικού κόστους για κάθε λειτουργία. Διαφορετικές λειτουργίες µπορεί να έχουν διαφορετικά επιµεριστικά κόστη. Το επιµεριστικό κόστος των λειτουργιών µπορεί να είναι µεγαλύτερο ή µικρότερο από το πραγµατικό τους κόστος. Η πίστωση από λειτουργίες µε µεγαλύτερο από το πραγµατικό επιµεριστικό κόστος αποθηκεύεται σε συγκεκριµένα αντικείµενα της δοµής και χρησιµοποιείται αργότερα για την «πληρωµή» λειτουργιών µε επιµεριστικό κόστος µικρότερο από το πραγµατικό τους. ΗΥ240 - Παναγιώτα Φατούρου 30 15

Επιµεριστική Ανάλυση Αθροιστική Μέθοδος Αποδεικνύουµε ότι n, οποιαδήποτε ακολουθία n λειτουργιών απαιτεί συνολικά το πολύ T(n) βήµατα. Παράδειγµα 1 Στοίβα µε MultiPop() Έστω µια δοµή στοίβας που υποστηρίζει τις ακόλουθες λειτουργίες: Push(x): Εισαγωγή του στοιχείου x στην κορυφή της στοίβας. Pop(): Διαγραφή και επιστροφή του στοιχείου που βρίσκεται στην κορυφή της στοίβας. MultiPop(k): Διαγραφή των k πρώτων (υψηλότερων) στοιχείων της στοίβας. Αν υπάρχουν λιγότερα από k στοιχεία στη στοίβα, διαγράφονται όλα. MultiPop(k) { while (!IsEmptyStack() AND k 0) { Pop(); k = k-1; 25 top 10 3 5 7 91 24 (a) MultiPop(3) MultiPop(6) 5 top 7 91 24 (β) (γ) ΗΥ240 - Παναγιώτα Φατούρου 31 Επιµεριστική Ανάλυση Αθροιστική Μέθοδος Η χρονική πολυπλοκότητα των Push() και Pop() είναι Ο(1). Θεωρούµε ότι το κόστος κάθε µιας εξ αυτών είναι 1. Ποιο είναι το κόστος της MultiPop(k) αν η στοίβα περιέχει s στοιχεία? Ο(min{s,k) Ποιο είναι το κόστος µιας ακολουθίας n λειτουργιών στη στοίβα; Εύρεση Αυστηρού Άνω Φράγµατος Ισχυρισµός: Κάθε ακολουθία από n Push(), Pop() και MultiPop() ξεκινώντας από µια άδεια στοίβα έχει χρονική πολυπλοκότητα Ο(n). Γιατί ισχύει αυτό; Το πλήθος των διαγραφών από τη στοίβα δεν µπορεί να υπερβαίνει το πλήθος των λειτουργιών Push() στη στοίβα. Το πλήθος των Pop() συµπεριλαµβανοµένων των Pop() που καλούνται από MultiPop() είναι το πολύ όσο το πλήθος των Push(). Το πλήθος των λειτουργιών Push() που θα εκτελεστούν είναι O(n). " Η επιµεριστική χρονική πολυπλοκότητα κάθε λειτουργίας είναι O(n)/n = O(1). ΗΥ240 - Παναγιώτα Φατούρου 32 Ο(n 2 ) 16

Επιµεριστική Ανάλυση - Λογιστική Μέθοδος Καθορισµός του επιµεριστικού κόστους κάθε λειτουργίας. Διαφορετικές λειτουργίες µπορεί να έχουν διαφορετικά επιµεριστικά κόστη. Το επιµεριστικό κόστος των λειτουργιών µπορεί να είναι µεγαλύτερο ή µικρότερο από το πραγµατικό τους κόστος. Το «κέρδος» από λειτουργίες µε µεγαλύτερο από το πραγµατικό επιµεριστικό κόστος αποθηκεύεται σε συγκεκριµένα αντικείµενα της δοµής ως πίστωση και χρησιµοποιείται αργότερα για την «πληρωµή» λειτουργιών µε επιµεριστικό κόστος µικρότερο από το πραγµατικό τους. Το συνολικό επιµεριστικό κόστος οποιασδήποτε ακολουθίας λειτουργιών πρέπει να αποτελεί άνω φράγµα του συνολικού πραγµατικού κόστους της ακολουθίας Το συνολικό κέρδος (πίστωση) που είναι συσχετισµένο µε τα αντικείµενα της δοµής κάθε χρονική στιγµή πρέπει να είναι µη-αρνητικό. Παρατήρηση Σε αντίθεση µε την αθροιστική µέθοδο, η λογιστική µέθοδος δεν αποδίδει το ίδιο επιµεριστικό κόστος σε κάθε λειτουργία. ΗΥ240 - Παναγιώτα Φατούρου 33 Επιµεριστική Ανάλυση - Λογιστική Μέθοδος Παράδειγµα 1 Στοίβα που υποστηρίζει τη λειτουργία MultiPop() Πραγµατικό Κόστος Λειτουργιών Push() 1 Pop() 1 MultiPop(k) min{k,s Επιµεριστικό Κόστος Λειτουργιών Push() 2 Pop() 0 MultiPop(k) 0 Το επιµεριστικό κόστος κάθε λειτουργίας είναι O(1). Θα αποδείξουµε ότι για οποιαδήποτε ακολουθία n λειτουργιών, το συνολικό επιµεριστικό κόστος αποτελεί άνω φράγµα του συνολικού πραγµατικού κόστους. q Υποθέτουµε ότι κάθε µονάδα κόστους αναπαρίσταται από 1 ευρώ. q Κάθε φορά που πραγµατοποιείται µια Push(), το 1 εκ των 2 ευρώ χρησιµοποιείται για το κόστος της Push(), ενώ το άλλο αποθηκεύεται στο νέο στοιχείο που εισάγεται στη δοµή. q Το έξτρα ευρώ που είναι αποθηκευµένο σε κάθε στοιχείο της δοµής θα χρησιµοποιηθεί για την «πληρωµή» της Pop() του στοιχείου από τη δοµή (είτε αυτή καλείται άµεσα από τον χρήστη είτε έµµεσα µέσω µιας MultiPop()). ΗΥ240 - Παναγιώτα Φατούρου 34 17

Αναφορές Το υλικό της ενότητας αυτής περιέχεται στα ακόλουθα βιβλία: Harry Lewis and Larry Denenberg, Data Structures and Their Algorithms, Harper Collins Publishers, Inc., New York, 1991 Chapter 3: Lists Cormen, Leiserson, Rivest & Stein, Εισαγωγή στους Αλγορίθµους, Πανεπιστηµιακές Εκδόσεις Κρήτης, 2006. Κεφάλαιο 17: Αντισταθµιστική Ανάλυση ΗΥ240 - Παναγιώτα Φατούρου 35 18