Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Σχετικά έγγραφα
ΕΝΟΤΗΤΑ 6 ΛΙΣΤΕΣ ΠΑΡΑΛΕΙΨΗΣ (SKIP LISTS)

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

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

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

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Φροντιστήριο 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); } }

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

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

Προγραμματισμός Ι (ΗΥ120)

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

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

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

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Προγραµµατισµός Ι (ΗΥ120)

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

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

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

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

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

AVL-trees C++ implementation

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

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

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

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

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

C: Από τη Θεωρία στην Εφαρμογή

HY240 : Δομές Δεδομένων. Φροντιστήριο Προγραμματιστικής Εργασίας 2 ο και 3 ο Μέρος

ΗΥ360 Αρχεία και Βάσεις εδοµένων

Διδάσκων: Κωνσταντίνος Κώστα

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

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Αλγόριθµοι και Πολυπλοκότητα

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

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

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

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

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

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Δημιουργία Δυαδικών Δέντρων Αναζήτησης

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

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

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

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

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

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

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

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

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

Στοιχειώδεις Δομές Δεδομένων

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

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

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

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

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

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Cuckoo Hashing. Αλγόριθμοι και Πολυπλοκότητα. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

Πανεπιστήµιο Θεσσαλίας, THMMY HY120, Σεπτέµβριος 2015 ΟΝΟΜΑΤΕΠΩΝΥΜΟ:

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

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

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

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

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

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

Διδάσκων: Κωνσταντίνος Κώστα

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Κατακερματισμός. 4/3/2009 Μ.Χατζόπουλος 1

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

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

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

Διάλεξη 14: Δέντρα IV - B-Δένδρα

Δένδρα. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

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

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Δομημένος Προγραμματισμός (ΤΛ1006)

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Σημειώσεις έκτης και έβδομης εβδομάδας

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

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

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

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

HY-486 Αρχές Κατανεμημένου Υπολογισμού

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

Λίστες παράλειψης (skip lists)

Δείτε τώρα και πώς θα έπρεπε να ήταν το παραπάνω: Page 1

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ Τμήμα Πληροφορικής & Τηλεπικοινωνιών Μια σημείωση από τον Α. Δελή για το άρθρο: W. Pugh, Skip Lists: A Probabilistic Alternative to Balanced Trees, Comms of the ACM, 33(), June 10, 8-7. Εισαγωγη στη δομή δεδομενων Skip-List Η Skip-List μοιάζει αρκετά με μια απλή ταξινομημένη συνδεδεμένη λίστα όπως εκείνη του Σχήματος 1. Ο κάθε 3 7 12 17 1 21 2 Σχήμα 1: Ταξινομημένη συνδεδεμένη λίστα κόμβος της skip-list ομως μπορεί να περιέχει ένα ή περισσότερους δείκτες (forward pointers) προς κάποιους από τους επόμενους κόμβους της λίστας. Το Σχήμα 2 αναπαριστά μια τυχαία skip-list που περιέχει τα ίδια κλειδιά με εκεινα της απλής λίστας του Σχήματος 1. Επειδή αυτή η νέα δομή ουσιαστικά περιέχει συνδεδεμένες λίστες με επιπλέον δείκτες που παρακάμπτουν ενδιάμεσους κόμβους, ονομάστηκε Skip-List. Ο κάθε κόμβος έχει πάντα MaxLevel forward pointers οι οποίοι όμως δεν χρησιμοποιούνται όλοι για να δείξουν σε επόμενους κόμβους. Ο αριθμός των forward pointers που δείχνουν σε επόμενους κόμβους αποφασίζεται τυχαία σύμφωνα με τον αλγόριθμο εισαγωγής που παρουσιάζεται στη συνέχεια. Στο προγραμμά σας αυτό θα γίνεται με την χρήση των συναρτήσεων srand(seed)/rand(). Οι μόνες εξαιρέσεις είναι ο πρώτος κόμβος () και ο τελευταίος. Ο έχει πάντα MaxLevel pointers που είτε δείχνουν στον τελευταίο κόμβο είτε σε κάποιο ενδιάμεσο κόμβο. Οι forward pointers του τελευταίου κόμβου είναι όλοι NULL. forward[maxlevel 1] 12 17 1 21 2 forward[0] Σχήμα 2: Skip-List Βασικές έννοιες της Skip-List Ο κάθε κόμβος της skip-list περιέχει υποχρεωτικά ένα πεδίο κλειδί που τον χαρακτηρίζει μοναδικά, ένα δείκτη προς τα δεδομένα που θέλουμε να αποθηκεύσουμε καθώς επίσης και MaxLevel forward pointers. Το MaxLevel είναι μια σταθερά που εμείς ορίζουμε. Στο Σχήμα 2 αναπαριστούμε τους κόμβους χωρίς τα αποθηκευμένα δεδομένα τους. Επίσης, το Σχήμα 2 αναπαριστά σε κάθε κόμβο μόνο τους forward pointers που χρησιμοποιούνται για να δείξουν σε επόμενους κόμβους. Ο της skip-list είναι ένας κόμβος που περιέχει MaxLevel forward pointers που αντιστοιχούν στα επίπεδα από μηδέν έως MaxLevel-1. 1

Οταν εισάγουμε ένα νέο κόμβο στη λίστα, επιλέγουμε τυχαία το επίπεδο στο οποίο θα εισαχθεί ανεξάρτητα από τα δεδομένα που περιέχει. Ο κόμβος που βρίσκεται στο επίπεδο i περιέχει i forward pointers που δείχνουν προς επόμενους κόμβους της λίστας. Οι υπόλοιποι MaxLevel-i pointers είτε δείχνουν στον τελευταίο κόμβο είτε σε NULL (μιας και οι εν λόγω pointers δεν επισκεπτονται ποτέ). Αρχικοποίηση της Skip-List Ο κάθε κόμβος της skip-list μπορει να ειναι είναι ένα struct πιθανώς με την μορφη: struct node { int key; record *ptr; struct node* forward[maxlevel]; } H skip-list αρχικοποιείται με την εντολή του κέλυφους του προγράμματος initialize MaxNumOfPointers. Ο αριθμός MaxNumOfPointers καθορίζει την τιμή του MaxLevel και η μια μέγιστη τιμή την οποία δεν θα πάρουν ποτέ τα κλειδιά της λίστας. Αρχικά η λίστα περιέχει μόνο δύο κόμβους: τον και ένα κόμβο τερματισμού (). Ο κόμβος του χρησιμοποιείται μόνο για να έχουμε πρόσβαση στους forward pointers. Δεν μας ενδιαφέρει ούτε ασχολούμαστε ποτέ με την τιμή του κλειδιού του. Ο κόμβος τερματισμού περιέχει ένα πεδίο κλειδί του οποίου η τιμή είναι ίση με. Οπως αναφεραμε, η είναι μια τιμή μεγαλύτερη από οποιαδήποτε τιμή μπορούν να πάρουν τα κλειδιά της skip-list την οποία ορίζουμε με την βοήθεια της εντολής initialize. Οι forward pointers του κόμβου τερματισμού είναι όλοι NULL. Αρχικά, όλοι οι forward pointers του δείχνουν στον κόμβο τερματισμού οπως δειχνει το Σχημα 3. Σχήμα 3: Αδεια Skip-list Αλγόριθμος αναζήτησης Ο αλγόριθμος αναζήτησης επιστρέφει τα περιεχόμενα του κόμβου ο οποίος χαρακτηρίζεται από το επιθυμητό πεδίο κλειδί (ή τίποτα στην περίπτωση που το ζητούμενο κλειδί δεν υπάρχει στη λίστα). Ο αλγόριθμος αναζήτησης αναπαριστάται στον Αλγοριθμο 1. Η αναζήτηση ξεκινά από το επίπεδο MaxLevel-1 της λίστας. Οταν δεν βρεθεί ο ζητούμενος κόμβος σε αυτό το επίπεδο, τότε η αναζήτηση προχωρά στο αμέσως χαμηλότερο επίπεδο μέχρι να φτάσουμε στο επίπεδο μηδέν. Η μεταβλητή x που εμφανίζεται στους παρακάτω αλγορίθμους αποτελεί ένα δείκτη στη δομή (struct) που περιγράφει ένα κόμβο. Στο Σχημα 4 βλέπετε την πορεία για την ανεύρεση του κόμβου που το κλειδί του είναι το 21. 2

Algorithm 1 Search(, searchkey) 1: x := 2: for i = MaxLevel 1 downto 0 do 3: while x forward[i] key < searchkey do 4: x := x forward[i] 5: end while : end for 7: x := x forward[0] 8: if x key = searchkey then : return x value 10: else 11: return failure 12: end if Search Path 12 17 1 21 2 Σχήμα 4: Μονοπατι για επερωτηση βρες το κομβο με κλειδι 21 στην skip-list Αλγόριθμος Εισαγωγής Ο αλγόριθμος εισαγωγής βρίσκει την σωστή τοποθεσία που πρεπει να εισαχθεί ενα κλειδί (και τα σχετικά δεδομένα) και εισάγει ένα νέο κόμβο με αυτό το κλειδί αν δεν υπάρχει ήδη στην skip-list.. Η εισαγωγή κλειδιών (και αντιστοίχων δεδομένων) δίνεται από τον Αλγόριθμο 2. Ενα παράδειγμα εισαγωγής εγγραφής με κλειδί 17 δίνεται στο Σχήμα 5. Προφανώς, όταν η εισαγωγή της εγγραφής με κλειδί 17 ολοκληρωθεί και αν ο Search Path update[i]=forward[i] 12 1 21 2 17 is to be inserted in the Skip List Σχήμα 5: Παράδειγμα εισαγωγής κόμβου με το κλειδι 17 κόμβος τυγχάνει να αποκτήσει δύο forwarding pointers τότε η skip-list γίνεται όπως εκείνη του Σχήματος 4. Το επίπεδο στο οποίο γίνεται μια εισαγωγή καθορίζεται χρησιμοποιώντας τη γεννήτρια τυχαίων αριθμών randomlevel() (που θα την υλοποιησετε με την βοηθεια των κλησεων srand(seed)/rand()). Να σημειωθεί ότι η 3

Algorithm 2 Insert(, searchkey, newv alue) 1: local update[0..maxlevel-1] 2: x := 3: for i = MaxLevel 1 downto 0 do 4: while x forward[i] key < searchkey do 5: x := x forward[i] : end while 7: update[i] := x 8: end for : x := x forward[0] 10: if x key = searchkey then 11: x value := newv alue 12: else 13: lvl := randomlevel() 14: x := maken ode(lvl, searchkey, value) 15: for i = 0 to lvl do 1: x forward[i] := update[i] forward[i] 17: update[i] f orward[i] := x 18: end for 1: end if γεννήτρια τυχαίων αριθμών πρέπει να παράγει αριθμούς στο διάστημα από 0 έως και MaxLevel-1. Ο νέος κόμβος που δημιουργείται με τη συνάρτηση makenode(lvl, searchkey, value), περιέχει το κλειδί searchkey, τα δεδομένα value και τοποθετείται στο επίπεδο lvl. Ολοι οι forward pointers του νέου κόμβου δείχνουν στον τερματικό κόμβο αμέσως μετά την ολοκλήρωση τη συνάρτησης makenode(). Στη συνέχεια του αλγορίθμου εισαγωγής, το for loop είναι υπεύθυνο για το ταίριασμα του νέου κόμβου μέσα στη λίστα. Να σημειωθεί ότι η τοπική μεταβλητή update είναι ένας μονοδιάστατος πίνακας που περιέχει MaxLevel δείκτες σε δομές (struct) τύπου κόμβου. 4

Αλγόριθμος Διαγραφής Ο αλγόριθμος διαγραφής διαγράφει τα δεδομένα που αντιστοιχούν σε ένα κλειδί καθώς και το ίδιο το κλειδί και δίνεται στο Αλγόριθμο 3. Η συνάρτηση free() απελευθερώνει τη μνήμη που δεσμεύτηκε από τη συνάρτηση Algorithm 3 Delete(, searchkey) 1: local update[0..maxlevel-1] 2: x := 3: for i = MaxLevel 1 downto 0 do 4: while x forward[i] key < searchkey do 5: x := x forward[i] : end while 7: update[i] := x 8: end for : x := x forward[0] 10: if x key = searchkey then 11: for i = 0 to MaxLevel 1 do 12: if update[i] forward[i] x then 13: break 14: end if 15: update[i] forward[i] := x forward[i] 1: end for 17: free(x) 18: end if makenode(). 5