Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

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

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Δομές Δεδομένων (Data Structures)"— Μεταγράφημα παρουσίασης:

1 Δομές Δεδομένων (Data Structures)
Διδάσκοντες: Kαθηγητής Σπύρος Σιούτας Αν. καθηγητής Χρήστος Μακρής Διδάσκων με βάση Π.Δ. 407:

2 Διδασκαλία Μαθήματος 4 ώρες την εβδομάδα (θεωρία + ασκήσεις).
Τρίτη (Β) και Πέμπτη (Β). Εργασία συμπληρωματική του βαθμού. Oι εργασίες παραδίδονται Ιούνιο/Σεπτέμβριο. Ο βαθμός της εργασίας μπορεί να κρατηθεί μέχρι το Σεπτέμβριο.

3 Υπολογισμός βαθμού Το μάθημα περιλαμβάνει τελική γραπτή εξέταση και εργαστηριακές ασκήσεις (project).  Οι ασκήσεις είναι σε ομάδες από 1-3 άτομα. Η παράδοση των εργαστηριακών ασκήσεων είναι απαραίτητη για τoυς φοιτητές 2ου έτους. Oι φοιτητές μεγαλυτέρων ετών ΔΕΝ ΔΙΝΟΥΝ ΑΣΚΗΣΗ ΚΑΙ ΒΑΘΜΟΛΟΓΟΥΝΤΑΙ 100% ΑΠΟ ΤΟ ΓΡΑΠΤΟ ΤΟΥΣ. Οι εργαστηριακές ασκήσεις έχουν συμμετοχή 30% στην τελική βαθμολογία και μπορούν να παραδοθούν σε ομάδες των 1 έως 3 ατόμων.  Η βαθμολογία της εργασίας έχει ισχύ μόνο για το τρέχον ακ.έτος στο οποίο έχει παραδοθεί.

4 Διδακτικό βιβλίο Διδακτικό Βιβλίο:
Α. Τσακαλίδης: Δομές Δεδομένων, Εκδόσεις Πανεπιστημίου Πατρών, 2008. Βιβλία από ΕΥΔΟΞΟ: ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ: ΤΑ ΒΑΣΙΚΑ ΕΡΓΑΛΕΙΑ, KURT MEHLHORN, PETER SANDERS Δομές Δεδομένων, 2η Έκδοση, Μποζάνης Παναγιώτης Δ. ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ, Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein

5 Εισαγωγικά Δομή Δεδομένων= η συγκεκριμένη υλοποίηση ενός συχνά εμφανιζόμενου Αφηρημένου Τύπου Δεδομένων. Αφηρημένος Τύπος Δεδομένων είναι ένα σύνολο μαζί με μία συλλογή πράξεων στα στοιχεία του συνόλου. Παραδείγματα Δομών -- Λεξικό (βασικές πράξεις η εισαγωγή/διαγραφή στοιχείων και ο έλεγχος ανήκει/δεν ανήκει) – Διαφοροποίηση από έλεγχο για Predecessor -- Ουρές Προτεραιότητας (βασικές πράξεις η ένθεση στοιχείων, η εύρεση και διαγραφή του ελαχίστου)

6 Μοντέλα Μηχανής Μοντέλο Μηχανής Δεικτών (Pointer Machine)= η μνήμη αποτελείται από συλλογή εγγραφών, με κάθε εγγραφή να αποτελείται από ένα σύνολο από κελιά. Κάθε κελί έχει ένα τύπο (pointer, integer, real) και η προσπέλαση κελιών γίνεται με χρήση δεικτών. RAM Μοντέλο Υπολογισμού= η μνήμη αποτελείται από ένα πίνακα από κελιά, όπου κάθε κελί προσπελαύνεται με τη διεύθυνσή του. Υποθέτουμε ότι κάθε κελί μπορεί να περιέχει αριθμούς αυθαίρετου μεγέθους και ότι οι βασικές αριθμητικές πράξεις και πράξεις δεικτών παίρνουν σταθερό χρόνο (uniform cost assumption). Μετρικές Εκτίμησης Απόδοσης Χωρική, χρονική πολυπλοκότητα (διαφοροποίηση για τα δύο μοντέλα υπολογισμού).

7 RAM Μοντέλο Υπολογισμού
Βασικό θεωρητικό μοντέλο υπολογισμού: Άπειρη μνήμη Ομοιόμορφο κόστος προσπέλασης 4 καταχωρητές: 1 συσσωρευτή A, καταχωρητές δείκτη γ1, γ2, γ3.

8 Χρονική Πολυπλοκότητα
Ανάλυση μέσης περίπτωσης (average case analysis)= μία πιθανοτική κατανομή τίθεται στις πράξεις ενός αφηρημένου τύπου δεδομένων και το μέσο κόστος των πράξεων υπολογίζεται. Ανάλυση Χειρότερης Περίπτωσης (worst case analysis)= υπολογίζονται πολυπλοκότητες χειρότερης περίπτωσης για κάθε πράξη. Ανάλυση Επιμερισμένης Πολυπλοκότητας= υπολογίζεται το συνολικό κόστος μίας ακολουθίας πράξεων και επιμερίζεται το κόστος σε καθεμία πράξη.

9 Eκτίμηση Πολυπλοκότητας
Ορισμός: f(n) = O(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c και n0 τέτοιες ώστε f(n) ≤ cg(n) για όλα τα n ≥ n0 Ορισμός: f(n) = Ω(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c και n0 τέτοιες ώστε f(n) ≥ cg(n) για όλα τα n ≥ n0 Ορισμός: f(n) = Θ(g(n) αν και μόνο αν υπάρχουν θετικές σταθερές c1, c2 και n0 τέτοιες ώστε c1g(n) ≤ f(n) ≤ c2g(n) για όλα τα n ≥ n0

10 Relations Between Q, O, W

11 Relations Between Q, W, O I.e., (g(n)) = O(g(n)) Ç W(g(n))
Theorem : For any two functions g(n) and f(n), f(n) = (g(n)) iff f(n) = O(g(n)) and f(n) = (g(n)). I.e., (g(n)) = O(g(n)) Ç W(g(n)) In practice, asymptotically tight bounds are obtained from asymptotic upper and lower bounds. Comp 122

12 Bασική πηγή: Δομές Δεδομένων, Απ. Παπαδόπουλος

13 Review on Summations Constant Series: For integers a and b, a  b,
Linear Series (Arithmetic Series): For n  0, Quadratic Series: For n  0,

14 Review on Summations Cubic Series: For n  0,
Geometric Series: For real x  1, For |x| < 1,

15 Review on Summations Linear-Geometric Series: For n  0, real c  1,
Harmonic Series: nth harmonic number, nI+,

16 Review on Summations Telescoping Series:
Differentiating Series: For |x| < 1,

17 Bασική πηγή: Δομές Δεδομένων, Απ. Παπαδόπουλος

18 Aναδρομικές Σχέσεις Αναδρομικές Σχέσεις Παράδειγμα Πρώτης Τάξης
γραμμικές μη-γραμμικές an=nan-1-1 Δεύτερης Τάξης Γραμ. με μεταβλητούς συντελεστές an=an-1+2an-2 K τάξης an=F(an-1, …,an-k) Πλήρης ιστορίας Διαίρει και Βασίλευε an=a[n/2] +a[n/2]+n

19 Γραμμικές Σχέσεις με σταθερούς συντελεστές
c0an+c1an-1+…+ cran-r =f(n) Η λύση άθροισμα μίας ομογενούς λύσης και μίας ειδικής. an=an(h)+an(p)

20 Γραμμικές Σχέσεις Aναδρομής πρώτης τάξης Μη γραμμικές σχέσεις αναδρομής Αντικατάσταση Αλλαγή μεταβλητής Συνδυάσμός λύσεων Δένδρο αναδρομής

21 Γενική Μέθοδος

22 Δομημένοι τύποι Βασικοί τύποι δεδομένων
ακέραιος, πραγματικός, χαρακτήρας, δείκτης Βασικές δομές δεδομένων Πίνακας Εγγραφή Λίστα Στοίβα Ουρά

23 Εγγραφές – Σύνθετοι Τύποι Δεδομένων

24 Λίστες Πλεονεκτήματα Δυναμική δέσμευση μνήμης
Μεταβολή των στοιχείων κάθε θέσης Μειονεκτήματα Εύρεση στοιχείου σε Ο(n) χρόνο

25 Λίστα first(): O(1) last(): O(1) insert_after(pointer,data): O(1)
Υλοποίηση με πίνακα ή με δείκτες. first(): O(1) last(): O(1) insert_after(pointer,data): O(1) remove(pointer) find(data): O(n) size(): O(1) catenate_with(list): O(1)

26 Λίστες – Υλοποίηση

27 Λίστες – Διπλά Διασυνδεδεμένες
Λίστες – Διπλά Διασυνδεδεμένες Έξτρα πράξη: insert_before(pointer, data)

28 Στοίβα is_empty(): O(1) push(data): O(1) pop(): O(1) top(): O(1)
Υλοποίηση με πίνακα ή με λίστα. Όταν υλοποίηση με λίστα : insert_after(tail,), remove(tail), last(), size().

29 Στοίβα Λογική LIFO (Last-In First-Out).
Υποστηρίζονται δύο βασικές λειτουργίες: εισαγωγή (push) εξαγωγή (pop). Υλοποιείται συνήθως με πίνακα (όπου η κεφαλή T αυξο-μειώνεται κατά 1 σε κάθε εισαγωγή ή διαγραφή), αλλά και με συνδεδεμένη λίστα. Χρησιμοποιείται όταν θέλουμε να επεξεργαστούμε κάποια στοιχεία με αντίστροφη σειρά από αυτή που τα εισάγουμε (π.χ. στη μετατροπή δεκαδικού σε δυαδικό, όπου κάνουμε διαιρέσεις και παίρνουμε τα υπόλοιπα από το τέλος προς την αρχή).

30 Σωροί (Stacks) Λογική λειτουργίας Last In Fisrt Out (LIFO)
Το τελευταίο στοιχείο που θα εισαχθεί στον σωρό θα είναι και το πρώτο που θα εξαχθεί.

31 Σωροί - Πράξεις Υλοποίηση πράξεων με ψευδοκώδικα
Stack createS(max_stack_size) ::= create an empty stack whose maximum size is max_stack_size Boolean isFull(stack, max_stack_size) ::= if (number of elements in stack == max_stack_size) return TRUE else return FALSE

32 Σωροί - Πράξεις void push(int top, element item) {
/* add an item to the global stack */ if (top >= MAX_STACK_SIZE-1) { stack_full( ); return; } stack[++top] = item;

33 Σωροί - Πράξεις element pop(int top) {
/* return the top element from the stack */ if (top == -1) return stack_empty( ); /* returns and error key */ return stack[top--]; }

34 Σωροί – Υλοποίηση με Λίστες
Σωροί – Υλοποίηση με Λίστες Σωροί Λίστες push(int top, element item) insert_after(top, item) pop(int top) remove(top) top() Head() isFull() size()

35 Στοίβα Παράδειγμα 7 10 10 5 5 5 push(5) push(10) push(7) pop() pop()

36 Υλοποίηση Στοίβας με Συνδεδεμένη Λίστα
Τύπος ListNode struct ListNode {int data; struct ListNode *next;}; Τύπος stack typedef struct ListNode * stack; Εισαγωγή στοιχείου (push) στην κορυφή της στοίβας void push(stack * sp, int t){ struct ListNode * nptr = (struct ListNode *) malloc(sizeof(struct ListNode)); if (nptr == NULL) { printf("Out of memory\n"); exit(1); } nptr->data = t; nptr->next = *sp; *sp = nptr;

37 Υλοποίηση Στοίβας με Συνδεδεμένη Λίστα
Εξαγωγή στοιχείου (pop) από την κορυφή της στοίβας int pop(stack * sp){ struct ListNode * ptr; int result; if (*sp == NULL) { printf("Nothing to remove" " from an empty stack\n"); exit(1); } ptr = *sp; result = (*sp)->data; *sp = (*sp)->next; free(ptr); return result;

38 Υλοποίηση Στοίβας με Συνδεδεμένη Λίστα
Εξέταση στοιχείου στην κορυφή της στοίβας int top(stack s){ if (s == NULL) { printf(“Stack is empty!\n”); exit(1); } return s->data;

39 Ενδεικτικό Πρόγραμμα Χρήσης Στοίβας
#include <stdio.h> int main(void) { stack s=NULL; push(&s,2); push(&s,4); push(&s,5); printf("%d",pop(&s)); printf("\n%d", top(s)); }

40 Βασικές Εφαρμογές Στοίβας
κλήση υποπρογραμμάτων αναπαράσταση και εκτίμηση αριθμητικών εκφράσεων οπισθοδρόμηση (backtracking)

41 Άσκηση Σε μία αριθμητική έκφραση, συχνά χρησιμοποιούμε διάφορους τύπους παρενθέσεων, όπως π.χ. στην έκφραση {α+(β-[γ+δ]/(χ-ψ))}*(φ-(ω-(κ-[λ-μ]))). Εξηγήστε πώς, χρησιμοποιώντας μία στοίβα, μπορούμε να εξετάσουμε αν υπάρχει ο ίδιος αριθμός αριστερών και δεξιών παρενθέσεων και αν για κάθε δεξιά υπάρχει μία αριστερή του ίδιου τύπου. Η εξήγηση (αλγόριθμος) θα είναι η λύση του προβλήματος σε φυσική γλώσσα.

42 Ουρές (Queue) Λογική λειτουργίας: First In First Out (FIFO)
Εξάγεται ένα στοιχείο μόνο όταν έχουν διαγραφεί όλα τα προηγούμενά του. Στις υλοποιήσεις βολεύει η ανάποδη προοπτική

43 Ουρά is_empty(): O(1) push(data): O(1) pop(): O(1) first(): O(1)
Υλοποίηση με πίνακα ή με λίστα. Όταν υλοποίηση με λίστα χρήση: insert_after(tail,), remove(head), last(), size().

44 Ουρές – Υλοποίηση Υλοποίηση με χρήση πινάκων:
Απαιτείται η διατήρηση δύο επιπλέον δεικτών, του τέλους και της αρχής. Υλοποίηση 1η Υλοποίηση 2η

45 Υλοποίηση με πίνακα Στοίβα: Πίνακας Κ και ένας δείκτης Τop αρχικά ίσος με 0. push(data): Top=Top+1; K[Top]=data; pop(): if Top==0 error; x=K[Top]; Top=Top-1; Ουρά: Πίνακας S και δύο δείκτες Front και End. Εάν Front<End, η ουρά είναι S[Front]…S[End-1] Eάν Front=End η ουρά είναι άδεια. push(data): S[End]=data; End=(End+1) mod n; if (Front=End) then error pop(): if (Front=End) then Error; x=S[Front]; Front=(Front+1) mod n;

46 Ουρές – Υλοποίηση με λίστες
Ουρές – Υλοποίηση με λίστες Ουρές Λίστες enqueue(data) insert_after(tail, data) dequeue() remove(head) is_empty() size()

47 Ουρές – Υλοποίηση με λίστες
Ουρές – Υλοποίηση με λίστες void enqueue(pnode front, pnode rear, element item) { /* add an element to the rear of the queue */ pnode temp = (pnode) malloc(sizeof (queue)); if (IS_FULL(temp)) { fprintf(stderr, “ The memory is full\n”); exit(1); } temp->item = item; temp->next= NULL; if (front) { (rear) -> next= temp; } else { front = temp; rear = temp;

48 Ουρές – Υλοποίηση με λίστες
Ουρές – Υλοποίηση με λίστες element dequeue(pnode front) { /* delete an element from the queue */ pnode temp = front; element item; if (IS_EMPTY(front)) { fprintf(stderr, “The queue is empty\n”); exit(1); } item = temp->item; front = temp->next; free(temp); return item;

49 Αρχικοποίηση σε σταθερό χρόνο
A[1; N] ο πίνακας για αρχικοποίηση. Χρησιμοποιούμε πίνακα B[1; N] και στοίβα S[1; N], A[i] έχει αρχικοποιηθεί <-> 1<= B[i]<= t ΚΑΙ S[B[i]] = i Αρχικοποίηση A[i] συνεπώς t=t+1, B[i] =t, and S[t]= i.

50 Δέντρο Το δέντρο είναι ένα άκυκλο συνεκτικό και μη κατευθυνόμενο γράφημα. Για οποιουσδήποτε δύο κόμβους υπάρχει ένα μοναδικό μονοπάτι Πλήθος ακμών είναι ίσο με πλήθος κόμβων μείον ένα. |Ε|=|V|-1. Υλοποίηση με πίνακα ή με δείκτες.

51 Ορολογία Ρίζα Πρόγονοι Απόγονοι Πατέρας Παιδιά Βαθμός κόμβου
Βαθμός δένδρου Διαδρομή (path) Μήκος διαδρομής Βάθος Ύψος Φυλλοπροσανατολισμένο Κομβοπροσανατολισμένο ρίζα A B C D F E G

52 Αποτελούνται από κόμβους και ακμές που τους συνδέουν
Αποτελούνται από κόμβους και ακμές που τους συνδέουν. Κάθε κόμβος έχει παιδιά (πλην των φύλλων) και ένα μόνο γονέα (πλην της ρίζας). Ορολογία Διαδρομή (path) από ένα κόμβο Νx σε ένα άλλο κόμβο Νy είναι μια ακολουθία κόμβων όπου πρώτος είναι ο Νx, τελευταίος ο Νy και κάθε άλλος κόμβος είναι παιδί του προηγουμένου. Μήκος (length) μιας διαδρομής είναι ο αριθμός των ακμών που περιλαμβάνονται σ’ αυτήν. Επίπεδο (level) ή βάθος (depth) ενός κόμβου είναι το μήκος της μοναδικής διαδρομής από τη ρίζα στον κόμβο αυτό. Ύψος (height) ενός δένδρου είναι το μέγιστο βάθος των (τερματικών) κόμβων του. Βαθμός (degree) ενός κόμβου είναι ο αριθμός των παιδιών του. Βαθμός ενός δένδρου είναι ο μέγιστος των βαθμών των κόμβων του.

53

54

55

56 Δυαδικά Δένδρα Δυαδικά δένδρα: έχουν βαθμό 2.
Σε κάθε κόμβο: Αριστερό υποδένδρο - δεξιό υποδένδρο Πλήρες δυαδικό δένδρο: έχει το μέγιστο αριθμό κόμβων σε κάθε επίπεδο πλην ίσως του τελευταίου (αν στο τελευταίο δεν έχει το μέγιστο αριθμό κόμβων, οι κόμβοι πρέπει να είναι όσο το δυνατό αριστερά). Αναπαράσταση Συνεχόμενη αναπαράσταση (με πίνακα) Η ρίζα μπαίνει στη θέση 1. Αν ένας κόμβος είναι στη θέση k, το αριστερό παιδί του θα είναι στη θέση 2*k και το δεξιό παιδί του θα είναι στη θέση 2*k+1. Συνδεδεμένη αναπαράσταση (η πιο συνήθης μορφή) Χρήση 2 δεικτών (left, right)

57 Δυαδικά Δένδρα Δομή ενός κόμβου σε συνδεδεμένη αναπαράσταση Δεδομένα
Left Right Ρίζα αριστερού υποδένδρου Ρίζα δεξιού υποδένδρου αριστερό υποδένδρο Δεξιό υποδένδρο

58 Άσκηση Θεωρήστε ένα δυαδικό δένδρο όπου κάθε κόμβος έχει δύο παιδιά ή κανένα. Αποδείξτε ότι το πλήθος των εσωτερικών κόμβων είναι ίσο με το πλήθος των φύλλων μείον ένα.

59 Άσκηση Θεωρήστε ένα δυαδικό δένδρο όπου κάθε κόμβος έχει δύο παιδιά ή κανένα. Αποδείξτε ότι το πλήθος των εσωτερικών κόμβων είναι ίσο με το πλήθος των φύλλων μείον ένα. Απάντηση Έστω t το πλήθος των φύλλων, v το πλήθος των εσωτερικών κόμβων και e το πλήθος των ακμών. Για να μετρήσουμε το πλήθος των ακμών μπορούμε να τις χρεώσουμε στον κόμβο πατέρα (κάθε εσωτερικός κόμβος πατέρας έχει δύο παιδιά) ή στον κόμβο παιδί (κάθε κόμβος παιδί έχει ένα πατέρα, εκτός της ρίζας). Αν τις χρεώσουμε στον κόμβο πατέρα: e=2 * v (1) Αν τις χρεώσουμε στο κόμβο παιδί: e=t+v-1 (2) Aπό (1) και (2)  2*v=t+v-1  v=t-1

60 Διαπεράσεις Δυαδικών Δένδρων
Κάθε διαδικασία επίσκεψης όλων των κόμβων ενός δένδρου, ακριβώς μια φορά τον καθένα, λέγεται διαπέραση ή διάσχιση (traversal). Προδιατεταγμένη διαπέραση (pre-order): Για κάθε κόμβο, επισκεπτόμαστε πρώτα τον ίδιο τον κόμβο, έπειτα τους κόμβους του αριστερού του υποδένδρου και στη συνέχεια τους κόμβους του δεξιού του υποδένδρου. Μεταδιατεταγμένη διαπέραση (post-order): Για κάθε κόμβο, επισκεπτόμαστε πρώτα τους κόμβους του αριστερού του υποδένδρου, έπειτα τους κόμβους του δεξιού του υποδένδρου και στη συνέχεια τον ίδιο τον κόμβο. Ενδοδιατεταγμένη διαπέραση (in-order): Για κάθε κόμβο, επισκεπτόμαστε πρώτα τους κόμβους του αριστερού του υποδένδρου, έπειτα τον ίδιο τον κόμβο και στη συνέχεια τους κόμβους του δεξιού του υποδένδρου. Κατά σειρά επιπέδων διαπέραση (level-order): Διασχίζουμε τα επίπεδα του δένδρου, στη σειρά από επάνω προς τα κάτω, και σε κάθε επίπεδο επισκεπτόμαστε τους κόμβους από αριστερά προς τα δεξιά.

61

62 Μέθοδοι διέλευσης δένδρου
Προδιάταξη: Επεξεργάσου ρίζα Εφάρμοσε το ίδιο σε υποδένδρα L1,L2, …,Lk Μεταδιάταξη Επισκέψου τα υποδένδρα L1,L2, …,Lk Ενδοδιάταξη – συμμετρική διάταξη: Επισκέψου το αριστερό υποδένδρο L1 Επισκέψου το δεξιό υποδένδρο L2 Κατά σειρά επιπέδων διαπέραση (level-order): Διασχίζουμε τα επίπεδα του δένδρου, στη σειρά από επάνω προς τα κάτω, και σε κάθε επίπεδο επισκεπτόμαστε τους κόμβους από αριστερά προς τα δεξιά.

63 Διαπεράσεις Δυαδικών Δένδρων
Προδιατεταγμένη (ΡΑΔ): x, b, w, c, e, g, f, h, z Μεταδιατεταγμένη (ΑΔΡ): w, b, g, e, h, z, f, c, x Ενδοδιατεταγμένη (ΑΡΔ): b, w, x, g, e, c, h, f, z Κατά σειρά επιπέδων: x, b, c, w, e, f, g, h, z x b c w e f g h z

64 Διαπεράσεις Δυαδικών Δένδρων
// προδιατεταγμένη διαπέραση void preorder(TreeNode *t) { if (t) { visit(t); preorder(t->left); preorder(t->right); // Ρ Α Δ } // ενδοδιατεταγμένη διαπέραση void inorder(TreeNode *t){ inorder(t->left); visit(t); inorder(t->right); // Α Ρ Δ // μεταδιατεταγμένη διαπέραση void postorder(TreeNode *t){ postorder(t->left); postorder(t->right); visit(t); // Α Δ Ρ

65 Διαπεράσεις Δυαδικών Δένδρων
Άσκηση Να σχεδιάσετε έναν αλγόριθμο για τη διαπέραση ενός δυαδικού δένδρου κατά επίπεδα. Σχολιάστε για τη δομή δεδομένων που θα χρησιμοποιήσετε. Πόσες και ποιές διαπεράσεις απαιτούνται για να ανακατασκευάσουμε το αρχικό δυαδικό δένδρο;

66 Διαπεράσεις Δυαδικών Δένδρων
Διαπέραση δένδρου κατά επίπεδα // t: δείκτης σε κόμβο του δένδρου (αρχικά ή ρίζα) // q: δείκτης σε ουρά void LevelOrder(TreeNode *t, Queue *q){ while (t) { visit(t); // επεξεργασία κόμβου t // βάλε τα παιδιά του t στην ουρά if (t->left) insert(t->left, q); if (t->right) insert(t->right, q); // διαγραφή κόμβου από την ουρά t = delete(q); } typedef struct { TreeNode *first; TreeNode *last; int size; } Queue;

67 Διαπεράσεις Δυαδικών Δένδρων
Ανακατασκευή δυαδικού δένδρου Αν έχουμε ΜΟΝΟ μεταδιαπέραση, προδιαπέραση ή διαπέραση κατά επίπεδα δεν είναι εφικτός ο προσδιορισμός αριστερού και δεξιού υποδένδρου, ενώ αν έχουμε ΜΟΝΟ ενδοδιαπέραση δεν μπορούμε να προσδιορίσουμε τη ρίζα. Συνεπώς μία διαπέραση δεν αρκεί. Ομοίως αν έχουμε δύο διαπεράσεις από μεταδιαπέραση, προδιαπέραση ή διαπέραση κατά επίπεδα είναι αδύνατο να προσδιορίσουμε αριστερό και δεξιό υποδένδρο. Για παράδειγμα, δένδρο με δύο μόνο κόμβους έχει τις ίδιες μεταδιαπεράσεις, προδιαπεράσεις και διαπεράσεις κατά επίπεδα, ανεξάρτητα αν το μοναδικό φύλλο είναι αριστερό ή δεξιό παιδί της ρίζας.

68 ΘΕΜΑ 3 (1,25 μονάδες) Δίνονται οι ακόλουθες διαπεράσεις ενός δυαδικού δένδρου: ΠΡΟΔΙΑΤΑΞΗ: ABFGCDELT ΣΥΜΜΕΤΡΙΚΗ ΔΙΑΤΑΞΗ: FBGADCLET Ανασχηματίστε τη μορφή του συγκεκριμένου δυαδικού δένδρου. ΘΕΜΑ 3 (1,25 μονάδες) Δίνονται οι ακόλουθες διαπεράσεις ενός δυαδικού δένδρου: ΜΕΤΑΔΙΑΤΑΞΗ: EFCDBVWLMGA ΣΥΜΜΕΤΡΙΚΗ ΔΙΑΤΑΞΗ: ECFBDAVLWGM Ανασχηματίστε τη μορφή του συγκεκριμένου δυαδικού δένδρου.

69 Διαπεράσεις Δυαδικών Δένδρων
Ανακατασκευή δυαδικού δένδρου ΟΜΩΣ, αν έχουμε μία διαπέραση από μεταδιαπέραση, προδιαπέ-ραση και διαπέραση κατά επίπεδα ΚΑΙ την ενδοδιαπέραση, τότε με την πρώτη διαπέραση μπορούμε να προσδιορίσουμε τη ρίζα και με την ενδοδιαπέραση να προσδιορίσουμε τα στοιχεία του αριστερού και δεξιού υποδένδρου. Μετά μπορούμε να προσδιορίσουμε τις ΑΝΤΙΣΤΟΙΧΕΣ ΔΙΑΠΕΡΑΣΕΙΣ αριστερού και δεξιού υποδένδρου, σαρώνοντας τις αρχικές διαπεράσεις, και επαναλαμβάνοντας την ίδια διαδικασία να προσδιορίσουμε, από επάνω προς τα κάτω, όλο το δένδρο. ΣΥΝΕΠΩΣ ΔΥΟ ΔΙΑΠΕΡΑΣΕΙΣ είναι αρκετές αρκεί η μία από τις δύο να είναι η ενδοδιαπέραση. Παράδειγμα ανακατασκευής δυαδικού δένδρου με δύο διαπεράσεις δίνεται στην άσκηση 5.1.(σελ. 176).

70 Ειδικά Δυαδικά Δένδρα Δυαδικά Δένδρα Αναζήτησης
Το αριστερό υποδένδρο κάθε κόμβου έχει τιμές μικρότερες από την τιμή του κόμβου. Το δεξιό υποδένδρο κάθε κόμβου έχει τιμές μεγαλύτερες από την τιμή του κόμβου. Χρησιμοποιούνται στην αναζήτηση στοιχείων, όπου ενδέχεται να βελτιώσουν σημαντικά το χρόνο (αντίστοιχα με τη δυαδική αναζήτηση σε ταξινομημένο πίνακα). Η δυαδική αναζήτηση σε ταξινομημένο πίνακα παίρνει Ο(log n) χρόνο και αυτό επιτυγχάνεται και στα ισοζυγισμένα δυαδικά δένδρα αναζήτησης. Με ενδοδιατεταγμένη διαπέραση παίρνουμε τα στοιχεία ταξινομημένα κατά αύξουσα σειρά Δένδρα - Σωροί Πλήρη δυαδικά δένδρα. Στο σωρό ελαχίστων (μεγίστων) η τιμή κάθε κόμβου είναι μικρότερη (μεγαλύτερη) από τις τιμές των παιδιών του.

71 Πράξεις σε φυλλοπροσανατολισμένα
SEARCH(x) v<-ρίζα while (v!=φυλλο) { Εντόπισε υποδέντρο: Ηi-1(v)<x<=Hi(v) v<- i-οστός γιος του v } if (πληροφορία(v)=x) then βρεθηκε else δεν βρέθηκε INSERT(x) v<-φύλλο που τελειώνει η Search(x) if (πληροφορία(v)=x) then μη κάνεις τίποτα αλλιώς αντικατέστησε το v με min(x,cont(v) min(x,cont(v) max(x,cont(v)

72 DELETE(x) v<-το φύλλο στο οποίο τελειώνει η Search(x) if (πληροφορία(v)!=x) then μη κάνεις τίποτα else u<-o κοντινότερος πρόγονος του v με βαθμό >=2 Σβήσε την i-οστή πλευρά του u και ένα από τα Ηi-1(v),Hi(v) if degree(u)=1 then αντικατέστησε τον δείκτη από τον πατέρα του u προς τον u, με τον δείκτη στο γιο του u


Κατέβασμα ppt "Δομές Δεδομένων (Data Structures)"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google