Διαδρομές
/
8th
8th
/
Ασκήσεις
/
Κυκλικός buffer
Κυκλικός buffer

Κυκλικός buffer

Μέτριο

Οδηγίες

Ένας κυκλικός buffer, ένας επανακυκλούμενος buffer ή ένας buffer δακτυλίου είναι μια δομή δεδομένων που χρησιμοποιεί έναν μόνο buffer σταθερού μεγέθους, σαν να ήταν συνδεδεμένος από άκρη σε άκρη.

Ένας κυκλικός buffer ξεκινάει κενός και με κάποιο προκαθορισμένο μήκος. Για παράδειγμα, αυτός είναι ένας buffer 7 στοιχείων:

[ ][ ][ ][ ][ ][ ][ ]

Ας υποθέσουμε ότι ένα 1 γράφεται στη μέση του buffer (η ακριβής αρχική θέση δεν έχει σημασία σε έναν κυκλικό buffer):

[ ][ ][ ][1][ ][ ][ ]

Έπειτα, ας υποθέσουμε ότι προστίθενται άλλα δύο στοιχεία, το 2 και το 3, τα οποία προσαρτώνται μετά το 1:

[ ][ ][ ][1][2][3][ ]

Αν στη συνέχεια αφαιρεθούν δύο στοιχεία από τον buffer, αφαιρούνται οι παλαιότερες τιμές που υπάρχουν μέσα του. Τα δύο στοιχεία που αφαιρούνται, στην περίπτωση αυτή, είναι το 1 και το 2, αφήνοντας τον buffer με ένα μόνο 3:

[ ][ ][ ][ ][ ][3][ ]

Αν ο buffer έχει 7 στοιχεία, τότε είναι τελείως γεμάτος:

[5][6][7][8][9][3][4]

Όταν ο buffer γεμίσει, πετάγεται ένα σφάλμα, ειδοποιώντας τον client ότι περαιτέρω εγγραφές μπλοκάρονται μέχρι να ελευθερωθεί μια θέση.

Όταν ο buffer είναι γεμάτος, ο client μπορεί να επιλέξει να αντικαταστήσει τα παλαιότερα δεδομένα με μια εξαναγκασμένη εγγραφή. Στην περίπτωση αυτή, προστίθενται άλλα δύο στοιχεία, το A και το B, τα οποία αντικαθιστούν το 3 και το 4:

[5][6][7][8][9][A][B]

Τα 3 και 4 έχουν αντικατασταθεί από τα A και B, κάνοντας το 5 τα παλαιότερα δεδομένα μέσα στον buffer. Τέλος, αν αφαιρεθούν δύο στοιχεία, αυτό που θα επιστραφεί είναι τα 5 και 6, δίνοντας τον buffer:

[ ][ ][7][8][9][A][B]

Επειδή υπάρχει διαθέσιμος χώρος, αν ο client χρησιμοποιήσει ξανά την αντικατάσταση για να αποθηκεύσει το C και το D, τότε θα χρησιμοποιηθεί ο χώρος όπου ήταν αποθηκευμένα προηγουμένως το 5 και το 6, και όχι η θέση του 7 και του 8. Το 7 εξακολουθεί να είναι το παλαιότερο στοιχείο και ο buffer είναι για άλλη μια φορά γεμάτος.

[C][D][7][8][9][A][B]

Αυτή η άσκηση εισάγει μερικές έννοιες που μπορεί να μην έχεις ξαναδεί:

Χώρος ονομάτων οριζόμενος από τον χρήστη

Στη 8th, όλες οι λέξεις ανήκουν σε έναν χώρο ονομάτων, π.χ. το a:new αναφέρεται στη λέξη new του χώρου ονομάτων a. Μπορείς επίσης να ορίσεις δικούς σου χώρους ονομάτων, κάτι που κάνουμε στην αρχή του αρχείου circular-buffer.8th:

ns: cb

Αυτό σημαίνει ότι όλες οι λέξεις μέσα σε αυτό το αρχείο είναι προσβάσιμες μέσω του cb:<word>, που είναι ένας εξαιρετικός τρόπος να ομαδοποιείς σχετική λειτουργικότητα.

Για περισσότερες πληροφορίες, ρίξε μια ματιά στην τεκμηρίωση για τους χώρους ονομάτων.

Εξαιρέσεις

Οι λέξεις read και write αναμένεται και οι δύο να πετάξουν μια εξαίρεση όταν κληθούν σε έναν κυκλικό buffer με μη έγκυρη κατάσταση. Για περισσότερες πληροφορίες, δες την τεκμηρίωση για τις εξαιρέσεις και τον χειρισμό σφαλμάτων.

Αντικείμενα

Παρόλο που είσαι ελεύθερος να υλοποιήσεις τον κυκλικό buffer όπως θέλεις, θα μπορούσες να σκεφτείς να χρησιμοποιήσεις την υποστήριξη για αντικείμενα της 8th.


Πηγή

WikipediaΟ σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
8th Exercism

Έτοιμος να ξεκινήσεις την άσκηση Κυκλικός buffer;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις 8th με 70 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.

Αναλυτική ματιά στο Κυκλικός buffer!

Σε αυτό το βίντεο ρίχνουμε μια ματιά στον κυκλικό buffer, τι είναι, πού χρησιμοποιείται και διάφορες υλοποιήσεις, όπως ουρές, στατικούς και δυναμικούς πίνακες, αμετάβλητες δομές δεδομένων και μια διασκεδαστική υλοποίηση βασισμένη σε agents.