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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δομές Δεδομένων Ενότητα 3

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

Εισαγωγή στους Αλγορίθμους

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

Εισαγωγή στους Αλγορίθμους

Βάσεις Περιβαλλοντικών Δεδομένων

Δομές Δεδομένων Ενότητα 4

Διοικητική Λογιστική

Προγραμματισμός Η/Υ. Βασικές Προγραμματιστικές Δομές. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

ΣΥΣΤΗΜΑΤΑ ΗΛΕΚΤΡΙΚΗΣ ΕΝΕΡΓΕΙΑΣ ΙIΙ

Δομές Δεδομένων Ενότητα 1

Εισαγωγή στους Αλγορίθμους Ενότητα 10η Άσκηση Αλγόριθμος Dijkstra

Αλγόριθμοι και πολυπλοκότητα Συγχωνευτική Ταξινόμηση

Προγραμματισμός Η/Υ. Δομές Δεδομένων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

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

Εισαγωγή στους Αλγορίθμους

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

Λογιστική Κόστους Ενότητα 12: Λογισμός Κόστους (2)

Εισαγωγή στους Αλγορίθμους Ενότητα 10η

Εισαγωγή στους Υπολογιστές

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

Θερμοδυναμική. Ανοικτά Ακαδημαϊκά Μαθήματα. Πίνακες Νερού σε κατάσταση Κορεσμού. Γεώργιος Κ. Χατζηκωνσταντής Επίκουρος Καθηγητής

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

Ενότητα. Εισαγωγή στις βάσεις δεδομένων

Λογιστική Κόστους Ενότητα 8: Κοστολογική διάρθρωση Κύρια / Βοηθητικά Κέντρα Κόστους.

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

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

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Prim

Διαχείριση Πολιτισμικών Δεδομένων

1 η Διάλεξη. Ενδεικτικές λύσεις ασκήσεων

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 3: Έλεγχοι στατιστικών υποθέσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 1: Καταχώρηση δεδομένων

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 5

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 1

Εισαγωγή στην Διοίκηση Επιχειρήσεων

Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας. Βιοστατιστική (Ε) Ενότητα 2: Περιγραφική στατιστική

Βάσεις Περιβαλλοντικών Δεδομένων

Τίτλος Μαθήματος: Μαθηματική Ανάλυση Ενότητα Γ. Ολοκληρωτικός Λογισμός

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 4: ΑΝΑΠΑΡΑΣΤΑΣΗ ΔΕΔΟΜΕΝΩΝ - ΔΕΝΤΡΑ

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

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

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

Διοικητική Λογιστική

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

Ψηφιακή Επεξεργασία Εικόνων

Διεθνείς Οικονομικές Σχέσεις και Ανάπτυξη

Εισαγωγή στους Αλγορίθμους Ενότητα 9η

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

Σχεδίαση και Ανάλυση Αλγορίθμων Ενότητα 7: ΑΝΑΔΡΟΜΗ

Τεχνολογία Πολιτισμικού Λογισμικού

Λογιστική Κόστους Ενότητα 11: Λογισμός Κόστους (1)

Εισαγωγή στους Η/Υ. Ενότητα 2β: Αντίστροφο Πρόβλημα. Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών

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

Εισαγωγή στους Υπολογιστές

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

Ευφυής Προγραμματισμός

Εισαγωγή στους Αλγορίθμους Ενότητα 9η Άσκηση - Αλγόριθμος Kruskal

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

Προγραμματισμός Η/Υ. Αλγόριθμοι. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

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

Μάρκετινγκ Αγροτικών Προϊόντων

Γραμμική Άλγεβρα και Μαθηματικός Λογισμός για Οικονομικά και Επιχειρησιακά Προβλήματα

Βάσεις Περιβαλλοντικών Δεδομένων

Μαθηματικά Διοικητικών & Οικονομικών Επιστημών

Διαφήμιση και Δημόσιες Σχέσεις Ενότητα 9: Σχέσεις διαφημιστή-διαφημιζόμενου

Μηχανολογικό Σχέδιο Ι

Εισαγωγή στους Αλγορίθμους Φροντιστήριο 2

Πληροφορική ΙΙ Θεματική Ενότητα 5

Τεχνικό Σχέδιο - CAD

Ενδεικτικές λύσεις ασκήσεων διαγραμμάτων περίπτωσης χρήσης (1ο Μέρος)

Εισαγωγή στην Διοίκηση Επιχειρήσεων

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

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

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

Εισαγωγή στους Αλγορίθμους Ενότητα 8η

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

Εισαγωγή στους Αλγορίθμους Ενότητα 7η

Κβαντική Επεξεργασία Πληροφορίας

Δομές Δεδομένων Ενότητα 2

Transcript:

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

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

Λίστες Γραμμική λίστα (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 - Παναγιώτα Φατούρου 3

Τρόποι Υλοποίησης Λιστών Στατικές Λίστες Υλοποίηση με πίνακες Όλα τα στοιχεία της λίστας αποθηκεύονται σε πίνακα. Συνδεδεμένες Λίστες Χρήση δεικτών 228 224 232 222 000 P Σχήμα 1.4: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 ΗΥ240 - Παναγιώτα Φατούρου 4

Τρόποι Υλοποίησης Λιστών Θετικά δυναμικών έναντι στατικών λιστών Εισαγωγή/διαγραφή νέων στοιχείων γίνεται εύκολα Ο συνολικός αριθμός στοιχείων δεν χρειάζεται να είναι γνωστός εξ αρχής Αρνητικά δυναμικών έναντι στατικών λιστών Απαιτούν περισσότερη μνήμη (λόγω των δεικτών). Ποια είναι η πολυπλοκότητα χρόνου για την ανάκτηση του j-οστού στοιχείου στη λίστα; ΗΥ240 - Παναγιώτα Φατούρου 5

Στοίβες κορυφαίο Αφηρημένος τύπος δεδομένων Στοίβα (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 - Παναγιώτα Φατούρου 6 1 5 15 2 42 15 2 42 κορυφαίο Μετά την εισαγωγή στοιχείου (Push(1)) με τιμή 1 κορυφαίο Μετά την εκτέλεση της λειτουργίας της διαγραφής (Pop())

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

Υλοποίηση Λειτουργιών Στοίβας Pointer MakeEmptyStack(void) pointer S; S = newcell(stack); S->Length = 0; return S; 512 1024 S Χρονική Πολυπλοκότητα; Θ(1) boolean IsEmptyStack(pointer S) if (S->Length == 0) return 1; else return 0; Χρονική Πολυπλοκότητα; Θ(1) 1024 n A[N] 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 - Παναγιώτα Φατούρου 8

Υλοποίηση Λειτουργιών Στοίβας 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 - Παναγιώτα Φατούρου 9

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

Στοίβα ως Συνδεδεμένη Λίστα 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 - Παναγιώτα Φατούρου 11

222 D 223 000 224 F 225 232 226 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 226 228 226 x S P Χώρος στη μνήμη για τις μεταβλητές της Push Εισαγωγή σε Στοίβα 226 x P 228 228 224 232 222 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 - Παναγιώτα Φατούρου 12

222 D 223 000 224 F 225 232 226 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 Διαγραφή από Στοίβα 224 <pointer, info> Pop(pointer S) info x; if (IsEmptyStack(S)) then error; else x = Top(S); S = S->next; return <S,x>; Χρονική Πολυπλοκότητα; Θ(1) 228 224 232 222 Μνήμη; δεδομένα & (n+1) δείκτες (αν η στοίβα έχει n στοιχεία) ΗΥ240 - Παναγιώτα Φατούρου 13

Ουρά Αφηρημένος Τύπος Δεδομένων Ουρά (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 - Παναγιώτα Φατούρου 14

Στατικές Ουρές Υλοποίηση με Πίνακα Η στατική ουρά υλοποιείται ως ένα struct (στη C) με πεδία έναν πίνακα Α με προκαθορισμένο πλήθος θέσεων N και δύο ακεραίους: Length που υποδηλώνει το τρέχον μέγεθος της ουράς Front που υποδηλώνει τη θέση του πρώτου στοιχείου της ουράς 512 1024 Q στον πίνακα. Έστω Q ένας δείκτης στο struct μιας ουράς και έστω Type o τύπος των στοιχείων της ουράς. 1024 Αν Q->Length == 0, η ουρά είναι άδεια. Αν Q->Length == N, η ουρά είναι γεμάτη. e 1,, e n : στοιχεία ουράς 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 - Παναγιώτα Φατούρου 15

Υλοποίηση Λειτουργιών Ουράς pointer MakeEmptyQueue(void) pointer Q; /* temporary pointer */ Q = NewCell(Queue); /* malloc() */ Q->Front = 0; Q->Length = 0; return Q; 512 1024 Q Χρονική Πολυπλοκότητα; 1024 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 - Παναγιώτα Φατούρου 16

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

Ουρά ως Συνδεδεμένη Λίστα 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; F 1024 1024 Q NULL NULL Front Back Μετά την εισαγωγή των Α,F,E,D (με αυτή τη σειρά) στην ουρά 1024 228 222 Front Back 412 1024 Q boolean IsEmptyQueue(pointer Q) if (Q->Front == NULL) then return TRUE; else return FALSE; 228 224 232 222 A E 224 232 222 000 F E D Type Front(pointer Q) if (IsEmptyQueue(Q)) then error; else return ((Q->Front)->data); 1024 1024 Q 228 222 Χρονική Πολυπλοκότητα κάθε μιας από αυτές τις λειτουργίες; Θ(1) ΗΥ240 - Παναγιώτα Φατούρου 18

1η Περίπτωση 1024 Q Εισαγωγή σε Ουρά 2η Περίπτωση 1024 228 Front 412 1024 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 - Παναγιώτα Φατούρου 19

1η Περίπτωση 1024 Q Διαγραφή από Ουρά 2η Περίπτωση 1024 228 Front 412 1024 Q 1024 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 - Παναγιώτα Φατούρου 20

Συνδεδεμένες Λίστες Έστω ότι κάθε στοιχείο της λίστας (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 - Παναγιώτα Φατούρου 21

Κόμβος Φρουρός Προς επίλυση Πρόβλημα Αναζήτηση ενός στοιχείου x στη λίστα. 228 224 232 222 Λύση με κόμβο φρουρό Έχουμε εξ αρχής τοποθετήσει ένα κόμβο στη λίστα που λέγεται κόμβος φρουρός. Ο κόμβος αυτός είναι πάντα ο τελευταίος στη λίστα και χρησιμοποιείται μόνο για τη διαχείριση της λίστας (δηλαδή δεν θεωρείται στοιχείο της λίστας). Ένας δείκτης δείχνει μόνιμα σε αυτόν τον κόμβο. Κατά την αναζήτηση, η τιμή που αναζητείται αρχικά αποθηκεύεται στον κόμβο αυτό (π.χ. στο πεδίο data του struct του). Στη συνέχεια, εκτελείται διάσχιση της λίστας με τον γνωστό αλγόριθμο αναζήτησης για τo στοιχείο αυτό. Το στοιχείο θα βρεθεί σίγουρα, είτε νωρίτερα σε κάποια θέση άλλη από τον κόμβο φρουρό ή στον κόμβο φρουρό. Στην 1 η περίπτωση, η αναζήτηση είναι επιτυχημένη. Στην 2 η περίπτωση, όχι. Τι κερδίζουμε με τη χρήση κόμβου φρουρού; ΗΥ240 - Παναγιώτα Φατούρου 22 L 226 226 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 228 224 232 222 B C F pointer q = L; while (q!= NULL && q->data < x) q = q->next; return (q == NULL); ΗΥ240 - Παναγιώτα Φατούρου 23

Εισαγωγή Στοιχείου σε Ταξινομημένη Λίστα 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 228 224 232 222 E p B C F q ΗΥ240 - Παναγιώτα Φατούρου 24

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

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

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

Διπλά Συνδεδεμένες Λίστες Σχήμα 3.5: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 Κάθε κόμβος μιας διπλά συνδεδεμένης λίστας αποθηκεύει δείκτες και προς το επόμενο και προς το προηγούμενο στοιχείο του κόμβου. Διασχίσεις Zig-Zag είναι εύκολα υλοποιήσιμες! ΗΥ240 - Παναγιώτα Φατούρου 28

Διπλά Συνδεδεμένες Λίστες Εισαγωγή κόμβου στον οποίο δείχνει ο δείκτης P μετά τον κόμβο στον οποίο δείχνει ο δείκτης Q void DoublyLinkedInsert(pointer P,Q) /* insert node pointed to by P just after node pointed to by Q */ P P Q Q Pr ev Q Next Q Next P 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 Σχήμα 3.5: Lewis & Denenberg, Data Structures & Their Algorithms, Addison-Wesley, 1991 ΗΥ240 - Παναγιώτα Φατούρου 29

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

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

Επιμεριστική Ανάλυση Αθροιστική Μέθοδος Αποδεικνύουμε ότι 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) 5 top ΗΥ240 - Παναγιώτα Φατούρου 32 7 91 MultiPop(6) 24 (β) (γ)

Επιμεριστική Ανάλυση Αθροιστική Μέθοδος Η χρονική πολυπλοκότητα των 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 - Παναγιώτα Φατούρου 33

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

Επιμεριστική Ανάλυση - Λογιστική Μέθοδος Παράδειγμα 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 - Παναγιώτα Φατούρου 35

Αναφορές Το υλικό της ενότητας αυτής περιέχεται στα ακόλουθα βιβλία: 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 - Παναγιώτα Φατούρου 36

Τέλος Ενότητας

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Κρήτης» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.

Σημειώματα

Σημείωμα αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Μη Εμπορική Χρήση - Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό και τα οποία αναφέρονται μαζί με τους όρους χρήσης τους στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/by-nc-nd/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί..

Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Κρήτης, Παναγιώτα Φατούρου. «Δομές δεδομένων. Ενότητα 2η: Στοίβες Ουρές - Λίστες». Έκδοση: 1.0. Ηράκλειο/Ρέθυμνο 2013. Διαθέσιμο από τη δικτυακή διεύθυνση: http://www.csd.uoc.gr/~hy240/