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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Τηλ , Fax: , URL:

Τηλ , Fax: , URL:

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

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

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

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

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

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

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

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

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

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

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

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

Θεωρητικό Μέρος. 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); } }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Επιµέλεια Θοδωρής Πιερράτος

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

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

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

ένδρα (tail, head) Γονέας Παιδί (ancestor, descendant) Φύλλο Εσωτερικός Κόµβος (leaf, non-leaf) που αποτελεί το γονέα του v.

#2 Αλγόριθµοι, οµές εδοµένων και Πολυπλοκότητα

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

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

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

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

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

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

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

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

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

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


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

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

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

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

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Αφηρημένες Δομές Δεδομένων. Στοίβα (Stack) Υλοποίηση στοίβας

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

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

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

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

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

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

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

ΚΕΦΑΛΑΙΟ 8: Αφαίρεση δεδοµένων

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

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

Transcript:

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

Λίστες Γραµµική λίστα (linear list) είναι ένα σύνολο από n 0 στοιχεία ή κόµβους L 1,..., L n, τα οποία είναι διατεταγµένα µε γραµµική σειρά. Το στοιχείο L 1 είναι το πρώτο στοιχείο και το στοιχείο L n το τελευταίο στοιχείο της λίστας. Το στοιχείο L k προηγείται του στοιχείου L k+1 και έπεται του στοιχείου L k-1, 1 < k < n-1. L 1 : κεφαλή (head) L n : ουρά (tail) 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

Τρόποι Υλοποίησης Λιστών Στατικές Λίστες Υλοποίηση µε πίνακες Όλα τα στοιχεία της λίστας αποθηκεύονται σε πίνακα. Συνδεδεµένες Λίστες Χρήση δεικτών 228 P 224 232 222 000 Θετικά δυναµικών έναντι στατικών λιστών Εισαγωγή/διαγραφή νέων στοιχείων γίνεται πολύ εύκολα Ο συνολικός αριθµός στοιχείων δεν χρειάζεται να είναι γνωστός εξ αρχής Αρνητικά δυναµικών έναντι στατικών λιστών Απαιτούν περισσότερη µνήµη (λόγω των δεικτών). Ποια είναι η πολυπλοκότητα χρόνου για την ανάκτηση του j-οστού στοιχείου στη λίστα; ΗΥ240 - Παναγιώτα Φατούρου 3

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

Στατικές Στοίβες Υλοποίηση µε Πίνακα Μια στατική στοίβα υλοποιείται µε τη χρήση ενός µονοδιάστατου πίνακα Α. Ο πίνακας έχει ένα προκαθορισµένο πλήθος θέσεων N. Μια στοίβα µε n Nστοιχεία καταλαµβάνει τα στοιχεία Α[0],, Α[n-1] του πίνακα. Το A[n-1] είναι το κορυφαίο (ή τελευταίο) στοιχείο της στοίβας Το A[0] είναι το βαθύτερο (ή πρώτο) στοιχείο της στοίβας Η στοίβα υλοποιείται ως ένα struct (στη C) µε πεδία τον πίνακα Α και έναν ακέραιο Length που υποδηλώνει το µέγεθος της στοίβας (δηλαδή το τρέχον πλήθος στοιχείων στη στοίβα). Έστω S ένας δείκτης στο struct µιας στοίβας και έστω Type o τύπος των στοιχείων της στοίβας. Αν S->Length == 0, η στοίβα είναι άδεια. Αν S->Length == N, η στοίβα είναι γεµάτη. 512 ΗΥ240 - Παναγιώτα Φατούρου 5 n S Length A[0] A[n-1] A[N-1]

Υλοποίηση Λειτουργιών Στοίβας void MakeEmptyStack(void) Length = 0; Χρονική Πολυπλοκότητα; boolean IsEmptyStack(void) /* return (Length == 0); */ if (Length == 0) return 1; else return 0; Χρονική Πολυπλοκότητα; Type Top(void) if (IsEmptyStack()) then error; else (return(α[length 1])); Χρονική Πολυπλοκότητα; Θ(1) Θ(1) Θ(1) Pointer MakeEmptyStack(void) pointer S; S = newcell(stack); S->Length = 0; return S; boolean IsEmptyStack(pointer S) if (S->Length == 0) return 1; else return 0; Type Top(pointer S) if (IsEmptyStack(S)) then error; else (return((s->α)[s->length 1])); Συνολικός Απαιτούµενος Χώρος Μνήµης; Ανεξάρτητα από τον αριθµό των στοιχείων που έχουν εισαχθεί στη στοίβα: Ν ΗΥ240 - Παναγιώτα Φατούρου 6

Υλοποίηση Λειτουργιών Στοίβας Type Pop(void) if (Length == 0) then error else { x = Top(); Length = Length 1; } return x; A[N-1] A[4] A[3] A[2] A[1] A[0] top Χρονική Πολυπλοκότητα; Θ(1) void Push(Type x) if (Length == N) then error else { Length = Length + 1; A[Length-1] = x; } Χρονική Πολυπλοκότητα; Θ(1) A[3] A[2] A[1] A[0] top ΗΥ240 - Παναγιώτα Φατούρου 7

Πολλαπλή Στατική Στοίβα Περισσότερες από µια στοίβες που υλοποιούνται χρησιµοποιώντας έναν πίνακα. Παράδειγµα 1: ύο Στοίβες Έστω Α[0Ν-1] ο πίνακας που χρησιµοποιείται για την αποθήκευση στοιβών. Η 1 η στοίβα ξεκινάει από τη θέση Α[0] και αναπτύσσεται προς τα δεξιά, ενώ η 2 η ξεκινάει από τη θέση Α[Ν-1] και αναπτύσσεται προς τα αριστερά. των Παράδειγµα 2: n Στοίβες Ο πίνακας χωρίζεται σε n ίσα τµήµατα (στο παρακάτω σχήµα n = 4). ΗΥ240 - Παναγιώτα Φατούρου 8

Στοίβα ως Συνδεδεµένη Λίστα 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 228 224 232 222 A F E D Χρονική Πολυπλοκότητα κάθε µιας από τις παραπάνω λειτουργίες; Θ(1) E 224 232 222 000 S ΗΥ240 - Παναγιώτα Φατούρου 9

222 223 224 225 226 227 228 229 230 231 232 233 234 412 413 414 415 416 417 418 419 420 423 D 000 F 232 x 228 A 224 E 222 228 226 228 226 x S S P Χώρος στη µνήµη για τις µεταβλητές τις Push Εισαγωγή σε Στοίβα 226 x P 228 void Push(info x, pointer S) pointer P; /* temporary pointer */ P = NewCell(NODE); /* malloc() */ P->data = x; P->next = S; S = P; 228 224 232 222 Χρονική Πολυπλοκότητα; Θ(1) /* Αυτό στη C δεν έχει το επιθυµητό αποτέλεσµα! */ ΗΥ240 - Παναγιώτα Φατούρου 10

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

Ουρά Αφηρηµένος Τύπος εδοµένων Ουρά (Queue) Λίστα που µπορεί να τροποποιείται µόνο µε την εισαγωγή στοιχείων στο ένα άκρο της και τη διαγραφή στοιχείων από το άλλο. Το στοιχείο που αφαιρείται είναι πάντα αυτό που έχει παραµείνει στην ουρά για το µεγαλύτερο χρονικό διάστηµα. Λειτουργίες Enqueue(x,Q): Εισαγωγή στοιχείου µε τιµή x στο τέλος (back) της ουράς Q Dequeue(Q): ιαγραφή του πρώτου στοιχείου της Q (δηλαδή αυτό που βρίσκεται στην αρχή (front)) και επιστροφή της τιµής του Front(Q): επιστρέφει το πρώτο στοιχείο της Q. MakeEmptyQueue(): επιστρέφει <>, την κενή ουρά. IsEmptyQueue(Q): επιστρέφει TRUE αν Q == <> και FALSE διαφορετικά. Ουρά Q 5 front 15 1 9 back Μετά την εκτέλεση της λειτουργίας Enqueue(Q,6) 5 front 15 15 1 1 9 6 9 back Μετά την εκτέλεση της λειτουργίας Dequeue(Q)) Η µέθοδος επεξεργασίας των δεδοµένων ουράς λέγεται «Εξαγωγή κατά σειρά εισαγωγής» (First In First Out, FIFO). front back ΗΥ240 - Παναγιώτα Φατούρου 12

Στατικές Ουρές Υλοποίηση µε Πίνακα Μια στατική ουρά υλοποιείται µε τη χρήση ενός µονοδιάστατου πίνακα Α. Ο πίνακας έχει ένα προκαθορισµένο πλήθος θέσεων N. Η ουρά υλοποιείται ως ένα struct (στη C) µε πεδία τον πίνακα Α και δύο ακεραίους: Length που υποδηλώνει το µέγεθος της ουράς (δηλαδή το τρέχον πλήθος στοιχείων της ουράς) Front που υποδηλώνει τη θέση του πρώτου στοιχείου της ουράς στον πίνακα. Έστω Q ένας δείκτης στο struct µιας ουράς και έστω Type o τύπος των στοιχείων της ουράς. Αν Q->Length == 0, η ουρά είναι άδεια. Αν Q->Length == N, η ουρά είναι γεµάτη. 512 N-2 n ΗΥ240 - Παναγιώτα Φατούρου 13 x 3 x 1 x 2 Q Front Length A[0] = A[(Front + 2) % N] x n A[n-3]=A[(Front +n-1) % N] A[N-2] = A[Front % N] A[N-1] = A[(Front + 1) % N] x 1,, x n : στοιχεία ουράς A[Front mod N], A[(Front + 1) mod N], A[(Front + 2) mod N],, A[(Front + n - 1) mod N]: θέσεις στις οποίες είναι αποθηκευµένα τα x 1,, x n.

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

Υλοποίηση Λειτουργιών Ουράς 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; } Χρονική Πολυπλοκότητα; 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) Θ(1) 512 N-2 n x 3 x n x 1 x 2 Enqueue() A[N-2] ΗΥ240 - Παναγιώτα Φατούρου x 2 A[N-1] 15 Q Front Length A[0] A[n-3] A[N-2] A[N-1] 512 Dequeue() 512 N-2 n+1 x 3 x n x n+1 x 1 N-1 n-1 x 3 x n x 1 x 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]

Ουρά ως Συνδεδεµένη Λίστα Node: struct µε πεδία: data: πληροφορία αποθηκευµένη στο στοιχείο next: δείκτης στο επόµενο στοιχείο Queue: struct µε πεδία δύο δείκτες: Front: δείκτης στο πρώτο στοιχείο 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 228 224 232 222 ΗΥ240 - Παναγιώτα Φατούρου 16 A NULL NULL F Front Back 228 222 Front Back E 412 Q D Χρονική Πολυπλοκότητα κάθε µιας από αυτές τις λειτουργίες; Θ(1)

1η Περίπτωση Q Εισαγωγή σε Ουρά 2η Περίπτωση 228 Front 412 Q 222 Back Front Back NULL NULL 226 416 226 P x 000 228 224 232 222 A F E D 224 232 222 000 226 x 000 416 226 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 - Παναγιώτα Φατούρου 17

1η Περίπτωση Q ιαγραφή από Ουρά 2η Περίπτωση 228 Front 412 Q 222 Back Front Back 226 226 226 000 D 000 228 224 232 222 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 - Παναγιώτα Φατούρου 18

Συνδεδεµένες Λίστες Έστω ότι κάθε στοιχείο της λίστας (struct node) έχει δύο πεδία, έναν ακέραιο data και το δείκτη next. Ένας δείκτης L δείχνει στο πρώτο στοιχείο της λίστας. L 226 x 228 228 224 232 222 416 226 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 - Παναγιώτα Φατούρου 19

Κόµβος Φρουρός Αναζήτηση κόµβου µε συγκεκριµένη τιµή. Αν ο κόµβος δεν υπάρχει στη λίστα εισάγεται. Υπάρχει ένας κόµβος (που είναι τελευταίος πάντα στη λίστα) που λέγεται κόµβος φρουρός. Ένας δείκτης δείχνει µόνιµα σε αυτόν τον κόµβο. Κατά την αναζήτηση οποιουδήποτε κόµβου, η προς αναζήτηση τιµή αρχικά αποθηκεύεται στον κόµβο αυτό. Εκτελείται διάσχιση της λίστας και αναζήτηση της τιµής. Αν βρεθεί στον κόµβο φρουρό η τιµή αυτή δεν υπάρχει στη λίστα. Τι κερδίζουµε µε τη χρήση κόµβου φρουρού; boolean ListSearch(Type x) { pointer q = L; while (q!= NULL && q->data!= x) q = q->next; return (q == NULL); } 228 224 232 222 ΗΥ240 - Παναγιώτα Φατούρου 20 L 226 226 G

Εισαγωγή Στοιχείου σε Tαξινοµηµένη Λίστα Κάθε κόµβος της λίστας περιέχει π.χ. έναν ακέραιο data και ένα δείκτη next στον επόµενο κόµβο. Έστω L ένας δείκτης στο πρώτο στοιχείο της λίστας. Η λίστα είναι ταξινοµηµένη. Πρόβληµα προς επίλυση Εισαγωγή νέου στοιχείου στη λίστα, έτσι ώστε η λίστα να εξακολουθήσει να είναι ταξινοµηµένη. Έστω κ ο προς εισαγωγή ακέραιος. Πρόβληµα µε την εισαγωγή στοιχείου σε ταξινοµηµένη λίστα: Είναι δυνατή η εισαγωγή ενός στοιχείου µόνο ως επόµενου κόµβου κάποιου δεδοµένου κόµβου και όχι ως προηγούµενου. L 228 224 232 222 B C F pointer q = L; while (q!= NULL && q->data < x) q = q->next; return (q == NULL); ΗΥ240 - Παναγιώτα Φατούρου 21

Εισαγωγή Στοιχείου σε Ταξινοµηµένη Λίστα void LLInsert(Type k, pointer L) pointer C, ptr; /* temporary pointers */ q = L; pq = NULL; while (q!= NULL) and (q->data > K) { pq = q; q = q->next; } if (q!= NULL) and (q->data == K) then return; /* k is already in list */ p = NewCell(Node); /* malloc */ p->data = K; p->next = q; if (pq == NULL) then L = p; else pq->next = p; L pq 228 224 232 222 E p B C F q ΗΥ240 - Παναγιώτα Φατούρου 22

ιάσχιση Λίστας Εκτέλεση επίσκεψης σε ένα ή σε κάποια στοιχεία µιας λίστας που έχουν µια ιδιότητα. Θεωρούµε λίστα που περιέχει strings (αλφαριθµητικά) και είναι λεξικογραφικά ταξινοµηµένη. Πρόβληµα 1 εδοµένου ενός αλφαριθµητικού w, ζητείται το τελευταίο αλφαριθµητικό στη λίστα που προηγείται αλφαβητικά του w και τελειώνει µε το ίδιο γράµµα όπως το w. Παράδειγµα w = crabapple L = <canary, cat, chickadee, coelacanth, collie, corn, cup>. H απάντηση θα πρέπει να είναι collie. ΗΥ240 - Παναγιώτα Φατούρου 23

Πιθανοί Αλγόριθµοι Επίλυσης Προβλήµατος 1 Αλγόριθµος 1 ιασχίζουµε τη λίστα µέχρι να βρούµε την πρώτη λέξη που είναι αλφαβητικά µεγαλύτερη από την crabapple (στο παράδειγµα την cup), κρατώντας σε µια στοίβα δείκτες στους κόµβους που διασχίσαµε. Εξάγουµε έναν-έναν τους δείκτες από τη στοίβα και εξετάζουµε τα structs στα οποία δείχνουν (µε αυτό τον τρόπο πραγµατοποιούµε αντίστροφη διάσχιση της λίστας) µέχρι να βρούµε την πρώτη λέξη που τελειώνει σε e. 232 282 252 364 244 458 488 232 top 282 252 364 244 458 488 Είναι αυτή η πιο αποδοτική λύση; Αλγόριθµος 2 ιασχίζουµε τη λίστα ξεκινώντας από τον 1ο κόµβο της διατηρώντας ένα βοηθητικό δείκτη στο τελευταίο στοιχείο που διασχίσαµε και είχε την επιθυµητή ιδιότητα. Πως θα συγκρίνατε την πολυπλοκότητα των δύο αλγορίθµων? ΗΥ240 - Παναγιώτα Φατούρου 24

ιασχίσεις Zig-Zag Έστω ότι κάθε κόµβος της λίστας έχει τα εξής πεδία: string: λέξη num: ακέραιος next: δείκτης στον επόµενο κόµβο Πρόβληµα 2 ίδεται ένα αλφαριθµητικό w. Έστω ότι το w υπάρχει στη λίστα σε κάποιον κόµβο p του οποίου το πεδίο num έχει τιµή n. Αναζητείται η τιµή του πεδίου string του κόµβου που προηγείται του p κατά n θέσεις στη λίστα. Παρουσιάστε αλγόριθµο που να επιλύει το πρόβληµα. ΗΥ240 - Παναγιώτα Φατούρου 25

ιπλά Συνδεδεµένες Λίστες Κάθε κόµβος µιας διπλά συνδεδεµένης λίστας αποθηκεύει δείκτες και προς το επόµενο και προς το προηγούµενο στοιχείο του κόµβου. ιασχίσεις Zig-Zag είναι εύκολα υλοποιήσιµες! ΗΥ240 - Παναγιώτα Φατούρου 26

ιπλά Συνδεδεµένες Λίστες Εισαγωγή κόµβου στον οποίο δείχνει ο δείκτης 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 > Q > Next P Q > Next > Pr ev P Next ιαγραφή κόµβου P από τη λίστα void DoublyLinkedDelete(pointer P) /* delete node P from its doubly linked list */ P > Pr ev > Next P > Next > Pr ev P > Next P > Pr ev Α Β D E ΗΥ240 - Παναγιώτα Φατούρου 27

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

Επιµερισµένη Ανάλυση Αθροιστική Μέθοδος Αποδεικνύουµε ότι n, οποιαδήποτε ακολουθία n λειτουργιών απαιτεί συνολικά το πολύ T(n) βήµατα. Το επιµερισµένο κόστος κάθε λειτουργίας είναι εποµένως T(n)/n. Παράδειγµα 1 Στοίβα µε MultiPop() Έστω µια δοµή στοίβας που υποστηρίζει τις ακόλουθες λειτουργίες: Push(x): Εισαγωγή του στοιχείου x στην κορυφή της στοίβας. Pop(): ιαγραφή και επιστροφή του στοιχείου που βρίσκεται στην κορυφή της στοίβας. MultiPop(k): ιαγραφή των k πρώτων (υψηλότερων) στοιχείων της στοίβας. Αν υπάρχουν λιγότερα από k στοιχεία στη στοίβα, διαγράφονται όλα. 25 top 10 3 5 7 91 24 (a) MultiPop(3) 5 top (γ) ΗΥ240 - Παναγιώτα Φατούρου 29 7 91 MultiPop(6) 24 (β) MultiPop(k) { while not StackEmpty() and k 0 { Pop(); k = k-1; } }

Επιµερισµένη Ανάλυση Αθροιστική Μέθοδος Η χρονική πολυπλοκότητα των Push() και Pop() είναι Ο(1). Θεωρούµε ότι το κόστος κάθε µιας εξ αυτών είναι 1. Ποιο είναι το κόστος της MultiPop(k) αν η στοίβα περιέχει s στοιχεία? Ο(min{s,k}) Ποιο είναι το κόστος (χειρότερης περίπτωσης) µιας ακολουθίας n λειτουργιών στη στοίβα; Ο(n 2 ) Εύρεση Αυστηρού Άνω Φράγµατος Ισχυρισµός: Κάθε ακολουθία από n Push(), Pop() και MultiPop() ξεκινώντας από µια άδεια στοίβα έχει χρονική πολυπλοκότητα Ο(n). Γιατί ισχύει αυτό; Το πλήθος των διαγραφών από τη στοίβα δεν µπορεί να υπερβαίνει το πλήθος των λειτουργιών Push() στη στοίβα! Το πλήθος των Pop() συµπεριλαµβανοµένων των Pop() που καλούνται από λειτουργίες MultiPop() είναι το πολύ όσο το πλήθος των Push(). Το πλήθος των λειτουργιών Push() που θα εκτελεστούν είναι O(n). Η επιµερισµένη χρονική πολυπλοκότητα κάθε λειτουργίας είναι O(n)/n = O(1)! ΗΥ240 - Παναγιώτα Φατούρου 30

Επιµερισµένη Ανάλυση - Λογιστική Μέθοδος Καθορισµός του επιµερισµένου κόστους κάθε λειτουργίας. ιαφορετικές λειτουργίες µπορεί να έχουν διαφορετικά επιµερισµένα κόστη. Το επιµερισµένο κόστος των λειτουργιών µπορεί να είναι µεγαλύτερο ή µικρότερο από το πραγµατικό τους κόστος. Το «κέρδος» από λειτουργίες µε µεγαλύτερο από το πραγµατικό επιµερισµένο κόστος αποθηκεύεται σε συγκεκριµένα αντικείµενα της δοµής ως πίστωση και χρησιµοποιείται αργότερα για την «πληρωµή» λειτουργιών µε επιµερισµένο κόστος µικρότερο από το πραγµατικό τους. Το συνολικό επιµερισµένο κόστος οποιασδήποτε ακολουθίας λειτουργιών πρέπει να αποτελεί άνω φράγµα του συνολικού πραγµατικού κόστους της ακολουθίας Το συνολικό κέρδος (πίστωση) που είναι συσχετισµένο µε τα αντικείµενα της δοµής κάθε χρονική στιγµή πρέπει να είναι µη-αρνητικό. Παρατήρηση Σε αντίθεση µε την αθροιστική µέθοδο, η λογιστική µέθοδος δεν αποδίδει το ίδιο επιµερισµένο κόστος σε κάθε λειτουργία. ΗΥ240 - Παναγιώτα Φατούρου 31

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